pub const GRPC_ARES: u32 = 1;
pub const GRPC_IF_NAMETOINDEX: u32 = 1;
pub const GRPC_ALLOW_EXCEPTIONS: u32 = 1;
pub const GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY: &[u8; 31] =
    b"grpc-internal-encoding-request\0";
pub const GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM: &[u8; 35] =
    b"grpc.default_compression_algorithm\0";
pub const GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL: &[u8; 31] = b"grpc.default_compression_level\0";
pub const GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET: &[u8; 43] =
    b"grpc.compression_enabled_algorithms_bitset\0";
pub const GRPC_SLICE_BUFFER_INLINE_ELEMENTS: u32 = 8;
pub const GRPC_ARG_ENABLE_CENSUS: &[u8; 12] = b"grpc.census\0";
pub const GRPC_ARG_ENABLE_LOAD_REPORTING: &[u8; 19] = b"grpc.loadreporting\0";
pub const GRPC_ARG_SERVER_CALL_METRIC_RECORDING: &[u8; 34] = b"grpc.server_call_metric_recording\0";
pub const GRPC_ARG_MINIMAL_STACK: &[u8; 19] = b"grpc.minimal_stack\0";
pub const GRPC_ARG_MAX_CONCURRENT_STREAMS: &[u8; 28] = b"grpc.max_concurrent_streams\0";
pub const GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH: &[u8; 32] = b"grpc.max_receive_message_length\0";
pub const GRPC_ARG_MAX_MESSAGE_LENGTH: &[u8; 32] = b"grpc.max_receive_message_length\0";
pub const GRPC_ARG_MAX_SEND_MESSAGE_LENGTH: &[u8; 29] = b"grpc.max_send_message_length\0";
pub const GRPC_ARG_MAX_CONNECTION_IDLE_MS: &[u8; 28] = b"grpc.max_connection_idle_ms\0";
pub const GRPC_ARG_MAX_CONNECTION_AGE_MS: &[u8; 27] = b"grpc.max_connection_age_ms\0";
pub const GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS: &[u8; 33] = b"grpc.max_connection_age_grace_ms\0";
pub const GRPC_ARG_CLIENT_IDLE_TIMEOUT_MS: &[u8; 28] = b"grpc.client_idle_timeout_ms\0";
pub const GRPC_ARG_ENABLE_PER_MESSAGE_COMPRESSION: &[u8; 29] = b"grpc.per_message_compression\0";
pub const GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION: &[u8; 31] =
    b"grpc.per_message_decompression\0";
pub const GRPC_ARG_ENABLE_DEADLINE_CHECKS: &[u8; 30] = b"grpc.enable_deadline_checking\0";
pub const GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER: &[u8; 35] =
    b"grpc.http2.initial_sequence_number\0";
pub const GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES: &[u8; 27] = b"grpc.http2.lookahead_bytes\0";
pub const GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER: &[u8; 36] =
    b"grpc.http2.hpack_table_size.decoder\0";
pub const GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_ENCODER: &[u8; 36] =
    b"grpc.http2.hpack_table_size.encoder\0";
pub const GRPC_ARG_HTTP2_MAX_FRAME_SIZE: &[u8; 26] = b"grpc.http2.max_frame_size\0";
pub const GRPC_ARG_HTTP2_BDP_PROBE: &[u8; 21] = b"grpc.http2.bdp_probe\0";
pub const GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS: &[u8; 37] =
    b"grpc.http2.min_time_between_pings_ms\0";
pub const GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS: &[u8; 45] =
    b"grpc.http2.min_ping_interval_without_data_ms\0";
pub const GRPC_ARG_HTTP2_SCHEME: &[u8; 18] = b"grpc.http2_scheme\0";
pub const GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA: &[u8; 34] = b"grpc.http2.max_pings_without_data\0";
pub const GRPC_ARG_HTTP2_MAX_PING_STRIKES: &[u8; 28] = b"grpc.http2.max_ping_strikes\0";
pub const GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE: &[u8; 29] = b"grpc.http2.write_buffer_size\0";
pub const GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY: &[u8; 23] = b"grpc.http2.true_binary\0";
pub const GRPC_ARG_EXPERIMENTAL_HTTP2_PREFERRED_CRYPTO_FRAME_SIZE: &[u8; 52] =
    b"grpc.experimental.http2.enable_preferred_frame_size\0";
pub const GRPC_ARG_KEEPALIVE_TIME_MS: &[u8; 23] = b"grpc.keepalive_time_ms\0";
pub const GRPC_ARG_KEEPALIVE_TIMEOUT_MS: &[u8; 26] = b"grpc.keepalive_timeout_ms\0";
pub const GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS: &[u8; 36] =
    b"grpc.keepalive_permit_without_calls\0";
pub const GRPC_ARG_DEFAULT_AUTHORITY: &[u8; 23] = b"grpc.default_authority\0";
pub const GRPC_ARG_PRIMARY_USER_AGENT_STRING: &[u8; 24] = b"grpc.primary_user_agent\0";
pub const GRPC_ARG_SECONDARY_USER_AGENT_STRING: &[u8; 26] = b"grpc.secondary_user_agent\0";
pub const GRPC_ARG_MIN_RECONNECT_BACKOFF_MS: &[u8; 30] = b"grpc.min_reconnect_backoff_ms\0";
pub const GRPC_ARG_MAX_RECONNECT_BACKOFF_MS: &[u8; 30] = b"grpc.max_reconnect_backoff_ms\0";
pub const GRPC_ARG_INITIAL_RECONNECT_BACKOFF_MS: &[u8; 34] = b"grpc.initial_reconnect_backoff_ms\0";
pub const GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS: &[u8; 41] =
    b"grpc.dns_min_time_between_resolutions_ms\0";
pub const GRPC_ARG_SERVER_HANDSHAKE_TIMEOUT_MS: &[u8; 33] = b"grpc.server_handshake_timeout_ms\0";
pub const GRPC_SSL_TARGET_NAME_OVERRIDE_ARG: &[u8; 30] = b"grpc.ssl_target_name_override\0";
pub const GRPC_SSL_SESSION_CACHE_ARG: &[u8; 23] = b"grpc.ssl_session_cache\0";
pub const GRPC_ARG_TSI_MAX_FRAME_SIZE: &[u8; 24] = b"grpc.tsi.max_frame_size\0";
pub const GRPC_ARG_MAX_METADATA_SIZE: &[u8; 23] = b"grpc.max_metadata_size\0";
pub const GRPC_ARG_ABSOLUTE_MAX_METADATA_SIZE: &[u8; 32] = b"grpc.absolute_max_metadata_size\0";
pub const GRPC_ARG_ALLOW_REUSEPORT: &[u8; 18] = b"grpc.so_reuseport\0";
pub const GRPC_ARG_RESOURCE_QUOTA: &[u8; 20] = b"grpc.resource_quota\0";
pub const GRPC_ARG_EXPAND_WILDCARD_ADDRS: &[u8; 27] = b"grpc.expand_wildcard_addrs\0";
pub const GRPC_ARG_SERVICE_CONFIG: &[u8; 20] = b"grpc.service_config\0";
pub const GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION: &[u8; 39] =
    b"grpc.service_config_disable_resolution\0";
pub const GRPC_ARG_LB_POLICY_NAME: &[u8; 20] = b"grpc.lb_policy_name\0";
pub const GRPC_ARG_RING_HASH_LB_RING_SIZE_CAP: &[u8; 32] = b"grpc.lb.ring_hash.ring_size_cap\0";
pub const GRPC_ARG_SOCKET_MUTATOR: &[u8; 20] = b"grpc.socket_mutator\0";
pub const GRPC_ARG_SOCKET_FACTORY: &[u8; 20] = b"grpc.socket_factory\0";
pub const GRPC_ARG_GZIP_COMPRESSION_LEVEL: &[u8; 28] = b"grpc.gzip_compression_level\0";
pub const GRPC_ARG_MIN_MESSAGE_SIZE_TO_COMPRESS: &[u8; 39] =
    b"grpc.gprc_min_message_size_to_compress\0";
pub const GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE: &[u8; 45] =
    b"grpc.max_channel_trace_event_memory_per_node\0";
pub const GRPC_ARG_ENABLE_CHANNELZ: &[u8; 21] = b"grpc.enable_channelz\0";
pub const GRPC_ARG_USE_CRONET_PACKET_COALESCING: &[u8; 34] = b"grpc.use_cronet_packet_coalescing\0";
pub const GRPC_ARG_TCP_READ_CHUNK_SIZE: &[u8; 38] = b"grpc.experimental.tcp_read_chunk_size\0";
pub const GRPC_TCP_DEFAULT_READ_SLICE_SIZE: u32 = 8192;
pub const GRPC_ARG_TCP_MIN_READ_CHUNK_SIZE: &[u8; 42] =
    b"grpc.experimental.tcp_min_read_chunk_size\0";
pub const GRPC_ARG_TCP_MAX_READ_CHUNK_SIZE: &[u8; 42] =
    b"grpc.experimental.tcp_max_read_chunk_size\0";
pub const GRPC_ARG_TCP_TX_ZEROCOPY_ENABLED: &[u8; 42] =
    b"grpc.experimental.tcp_tx_zerocopy_enabled\0";
pub const GRPC_ARG_TCP_TX_ZEROCOPY_SEND_BYTES_THRESHOLD: &[u8; 55] =
    b"grpc.experimental.tcp_tx_zerocopy_send_bytes_threshold\0";
pub const GRPC_ARG_TCP_TX_ZEROCOPY_MAX_SIMULT_SENDS: &[u8; 57] =
    b"grpc.experimental.tcp_tx_zerocopy_max_simultaneous_sends\0";
pub const GRPC_ARG_TCP_RECEIVE_BUFFER_SIZE: &[u8; 29] = b"grpc.tcp_receive_buffer_size\0";
pub const GRPC_ARG_GRPCLB_CALL_TIMEOUT_MS: &[u8; 28] = b"grpc.grpclb_call_timeout_ms\0";
pub const GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG: &[u8; 55] =
    b"grpc.TEST_ONLY_DO_NOT_USE_IN_PROD.xds_bootstrap_config\0";
pub const GRPC_ARG_GRPCLB_FALLBACK_TIMEOUT_MS: &[u8; 32] = b"grpc.grpclb_fallback_timeout_ms\0";
pub const GRPC_ARG_EXPERIMENTAL_GRPCLB_CHANNEL_ARGS: &[u8; 38] =
    b"grpc.experimental.grpclb_channel_args\0";
pub const GRPC_ARG_PRIORITY_FAILOVER_TIMEOUT_MS: &[u8; 34] = b"grpc.priority_failover_timeout_ms\0";
pub const GRPC_ARG_WORKAROUND_CRONET_COMPRESSION: &[u8; 35] =
    b"grpc.workaround.cronet_compression\0";
pub const GRPC_ARG_OPTIMIZATION_TARGET: &[u8; 25] = b"grpc.optimization_target\0";
pub const GRPC_ARG_ENABLE_RETRIES: &[u8; 20] = b"grpc.enable_retries\0";
pub const GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING: &[u8; 33] = b"grpc.experimental.enable_hedging\0";
pub const GRPC_ARG_PER_RPC_RETRY_BUFFER_SIZE: &[u8; 31] = b"grpc.per_rpc_retry_buffer_size\0";
pub const GRPC_ARG_MOBILE_LOG_CONTEXT: &[u8; 24] = b"grpc.mobile_log_context\0";
pub const GRPC_ARG_DISABLE_CLIENT_AUTHORITY_FILTER: &[u8; 37] =
    b"grpc.disable_client_authority_filter\0";
pub const GRPC_ARG_ENABLE_HTTP_PROXY: &[u8; 23] = b"grpc.enable_http_proxy\0";
pub const GRPC_ARG_HTTP_PROXY: &[u8; 16] = b"grpc.http_proxy\0";
pub const GRPC_ARG_SURFACE_USER_AGENT: &[u8; 24] = b"grpc.surface_user_agent\0";
pub const GRPC_ARG_INHIBIT_HEALTH_CHECKING: &[u8; 29] = b"grpc.inhibit_health_checking\0";
pub const GRPC_ARG_DNS_ENABLE_SRV_QUERIES: &[u8; 28] = b"grpc.dns_enable_srv_queries\0";
pub const GRPC_ARG_DNS_ARES_QUERY_TIMEOUT_MS: &[u8; 28] = b"grpc.dns_ares_query_timeout\0";
pub const GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL: &[u8; 31] = b"grpc.use_local_subchannel_pool\0";
pub const GRPC_ARG_CHANNEL_POOL_DOMAIN: &[u8; 28] = b"grpc.channel_pooling_domain\0";
pub const GRPC_ARG_CHANNEL_ID: &[u8; 16] = b"grpc.channel_id\0";
pub const GRPC_ARG_AUTHORIZATION_POLICY_PROVIDER: &[u8; 35] =
    b"grpc.authorization_policy_provider\0";
pub const GRPC_ARG_SERVER_CONFIG_CHANGE_DRAIN_GRACE_TIME_MS: &[u8; 59] =
    b"grpc.experimental.server_config_change_drain_grace_time_ms\0";
pub const GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH: i32 = -1;
pub const GRPC_DEFAULT_MAX_RECV_MESSAGE_LENGTH: u32 = 4194304;
pub const GRPC_WRITE_BUFFER_HINT: u32 = 1;
pub const GRPC_WRITE_NO_COMPRESS: u32 = 2;
pub const GRPC_WRITE_THROUGH: u32 = 4;
pub const GRPC_WRITE_USED_MASK: u32 = 7;
pub const GRPC_INITIAL_METADATA_WAIT_FOR_READY: u32 = 32;
pub const GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET: u32 = 128;
pub const GRPC_INITIAL_METADATA_USED_MASK: u32 = 164;
pub const GRPC_CQ_CURRENT_VERSION: u32 = 2;
pub const GRPC_CQ_VERSION_MINIMUM_FOR_CALLBACKABLE: u32 = 2;
pub const GRPC_MAX_COMPLETION_QUEUE_PLUCKERS: u32 = 6;
pub const GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME: &[u8; 24] = b"transport_security_type\0";
pub const GRPC_SSL_TRANSPORT_SECURITY_TYPE: &[u8; 4] = b"ssl\0";
pub const GRPC_TLS_TRANSPORT_SECURITY_TYPE: &[u8; 4] = b"tls\0";
pub const GRPC_X509_CN_PROPERTY_NAME: &[u8; 17] = b"x509_common_name\0";
pub const GRPC_X509_SUBJECT_PROPERTY_NAME: &[u8; 13] = b"x509_subject\0";
pub const GRPC_X509_SAN_PROPERTY_NAME: &[u8; 30] = b"x509_subject_alternative_name\0";
pub const GRPC_X509_PEM_CERT_PROPERTY_NAME: &[u8; 14] = b"x509_pem_cert\0";
pub const GRPC_X509_PEM_CERT_CHAIN_PROPERTY_NAME: &[u8; 20] = b"x509_pem_cert_chain\0";
pub const GRPC_SSL_SESSION_REUSED_PROPERTY: &[u8; 19] = b"ssl_session_reused\0";
pub const GRPC_TRANSPORT_SECURITY_LEVEL_PROPERTY_NAME: &[u8; 15] = b"security_level\0";
pub const GRPC_PEER_DNS_PROPERTY_NAME: &[u8; 9] = b"peer_dns\0";
pub const GRPC_PEER_SPIFFE_ID_PROPERTY_NAME: &[u8; 15] = b"peer_spiffe_id\0";
pub const GRPC_PEER_URI_PROPERTY_NAME: &[u8; 9] = b"peer_uri\0";
pub const GRPC_PEER_EMAIL_PROPERTY_NAME: &[u8; 11] = b"peer_email\0";
pub const GRPC_PEER_IP_PROPERTY_NAME: &[u8; 8] = b"peer_ip\0";
pub const GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR: &[u8; 33] =
    b"GRPC_DEFAULT_SSL_ROOTS_FILE_PATH\0";
pub const GRPC_GOOGLE_CREDENTIALS_ENV_VAR: &[u8; 31] = b"GOOGLE_APPLICATION_CREDENTIALS\0";
pub const GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX: u32 = 4;
extern "C" {
    pub fn gpr_unreachable_code(
        reason: *const ::std::os::raw::c_char,
        file: *const ::std::os::raw::c_char,
        line: ::std::os::raw::c_int,
    ) -> !;
}
#[repr(u32)]
#[doc = " The various compression algorithms supported by gRPC (not sorted by\n compression level)"]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_compression_algorithm {
    GRPC_COMPRESS_NONE = 0,
    GRPC_COMPRESS_DEFLATE = 1,
    GRPC_COMPRESS_GZIP = 2,
    GRPC_COMPRESS_ALGORITHMS_COUNT = 3,
}
#[repr(u32)]
#[doc = " Compression levels allow a party with knowledge of its peer's accepted\n encodings to request compression in an abstract way. The level-algorithm\n mapping is performed internally and depends on the peer's supported\n compression algorithms."]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_compression_level {
    GRPC_COMPRESS_LEVEL_NONE = 0,
    GRPC_COMPRESS_LEVEL_LOW = 1,
    GRPC_COMPRESS_LEVEL_MED = 2,
    GRPC_COMPRESS_LEVEL_HIGH = 3,
    GRPC_COMPRESS_LEVEL_COUNT = 4,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_compression_options {
    #[doc = " All algs are enabled by default. This option corresponds to the channel\n argument key behind \\a GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET"]
    pub enabled_algorithms_bitset: u32,
    pub default_level: grpc_compression_options_grpc_compression_options_default_level,
    pub default_algorithm: grpc_compression_options_grpc_compression_options_default_algorithm,
}
#[doc = " The default compression level. It'll be used in the absence of call\n specific settings. This option corresponds to the channel\n argument key behind \\a GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL. If present,\n takes precedence over \\a default_algorithm.\n TODO(dgq): currently only available for server channels."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_compression_options_grpc_compression_options_default_level {
    pub is_set: ::std::os::raw::c_int,
    pub level: grpc_compression_level,
}
#[doc = " The default message compression algorithm. It'll be used in the absence of\n call specific settings. This option corresponds to the channel argument key\n behind \\a GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_compression_options_grpc_compression_options_default_algorithm {
    pub is_set: ::std::os::raw::c_int,
    pub algorithm: grpc_compression_algorithm,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_slice_refcount {
    _unused: [u8; 0],
}
#[doc = " A grpc_slice s, if initialized, represents the byte range\ns.bytes[0..s.length-1].\n\nIt can have an associated ref count which has a destruction routine to be run\nwhen the ref count reaches zero (see grpc_slice_new() and grp_slice_unref()).\nMultiple grpc_slice values may share a ref count.\n\nIf the slice does not have a refcount, it represents an inlined small piece\nof data that is copied by value.\n\nAs a special case, a slice can be given refcount == uintptr_t(1), meaning\nthat the slice represents external data that is not refcounted."]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpc_slice {
    pub refcount: *mut grpc_slice_refcount,
    pub data: grpc_slice_grpc_slice_data,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union grpc_slice_grpc_slice_data {
    pub refcounted: grpc_slice_grpc_slice_data_grpc_slice_refcounted,
    pub inlined: grpc_slice_grpc_slice_data_grpc_slice_inlined,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_slice_grpc_slice_data_grpc_slice_refcounted {
    pub length: usize,
    pub bytes: *mut u8,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_slice_grpc_slice_data_grpc_slice_inlined {
    pub length: u8,
    pub bytes: [u8; 23usize],
}
impl ::std::fmt::Debug for grpc_slice_grpc_slice_data {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(f, "grpc_slice_grpc_slice_data {{ union }}")
    }
}
impl ::std::fmt::Debug for grpc_slice {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(
            f,
            "grpc_slice {{ refcount: {:?}, data: {:?} }}",
            self.refcount, self.data
        )
    }
}
#[doc = " Represents an expandable array of slices, to be interpreted as a\nsingle item."]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpc_slice_buffer {
    #[doc = " This is for internal use only. External users (i.e any code outside grpc\n core) MUST NOT use this field"]
    pub base_slices: *mut grpc_slice,
    #[doc = " slices in the array (Points to the first valid grpc_slice in the array)"]
    pub slices: *mut grpc_slice,
    #[doc = " the number of slices in the array"]
    pub count: usize,
    #[doc = " the number of slices allocated in the array. External users (i.e any code\n outside grpc core) MUST NOT use this field"]
    pub capacity: usize,
    #[doc = " the combined length of all slices in the array"]
    pub length: usize,
    #[doc = " inlined elements to avoid allocations"]
    pub inlined: [grpc_slice; 8usize],
}
impl ::std::fmt::Debug for grpc_slice_buffer {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(
            f,
            "grpc_slice_buffer {{ base_slices: {:?}, slices: {:?}, inlined: {:?} }}",
            self.base_slices, self.slices, self.inlined
        )
    }
}
#[repr(u32)]
#[doc = " The clocks we support."]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum gpr_clock_type {
    #[doc = " Monotonic clock. Epoch undefined. Always moves forwards."]
    GPR_CLOCK_MONOTONIC = 0,
    #[doc = " Realtime clock. May jump forwards or backwards. Settable by\nthe system administrator. Has its epoch at 0:00:00 UTC 1 Jan 1970."]
    GPR_CLOCK_REALTIME = 1,
    #[doc = " CPU cycle time obtained by rdtsc instruction on x86 platforms. Epoch\nundefined. Degrades to GPR_CLOCK_REALTIME on other platforms."]
    GPR_CLOCK_PRECISE = 2,
    #[doc = " Unmeasurable clock type: no base, created by taking the difference\nbetween two times"]
    GPR_TIMESPAN = 3,
}
#[doc = " Analogous to struct timespec. On some machines, absolute times may be in\n local time."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct gpr_timespec {
    pub tv_sec: i64,
    pub tv_nsec: i32,
    #[doc = " Against which clock was this time measured? (or GPR_TIMESPAN if\nthis is a relative time measure)"]
    pub clock_type: gpr_clock_type,
}
extern "C" {
    #[doc = " Time constants. */\n/** The zero time interval."]
    pub fn gpr_time_0(type_: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    #[doc = " The far future"]
    pub fn gpr_inf_future(type_: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    #[doc = " The far past."]
    pub fn gpr_inf_past(type_: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    #[doc = " initialize time subsystem"]
    pub fn gpr_time_init();
}
extern "C" {
    #[doc = " Return the current time measured from the given clocks epoch."]
    pub fn gpr_now(clock: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    #[doc = " Convert a timespec from one clock to another"]
    pub fn gpr_convert_clock_type(t: gpr_timespec, clock_type: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    #[doc = " Return -ve, 0, or +ve according to whether a < b, a == b, or a > b\nrespectively."]
    pub fn gpr_time_cmp(a: gpr_timespec, b: gpr_timespec) -> ::std::os::raw::c_int;
}
extern "C" {
    pub fn gpr_time_max(a: gpr_timespec, b: gpr_timespec) -> gpr_timespec;
}
extern "C" {
    pub fn gpr_time_min(a: gpr_timespec, b: gpr_timespec) -> gpr_timespec;
}
extern "C" {
    #[doc = " Add and subtract times.  Calculations saturate at infinities."]
    pub fn gpr_time_add(a: gpr_timespec, b: gpr_timespec) -> gpr_timespec;
}
extern "C" {
    pub fn gpr_time_sub(a: gpr_timespec, b: gpr_timespec) -> gpr_timespec;
}
extern "C" {
    #[doc = " Return a timespec representing a given number of time units. INT64_MIN is\ninterpreted as gpr_inf_past, and INT64_MAX as gpr_inf_future."]
    pub fn gpr_time_from_micros(us: i64, clock_type: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    pub fn gpr_time_from_nanos(ns: i64, clock_type: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    pub fn gpr_time_from_millis(ms: i64, clock_type: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    pub fn gpr_time_from_seconds(s: i64, clock_type: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    pub fn gpr_time_from_minutes(m: i64, clock_type: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    pub fn gpr_time_from_hours(h: i64, clock_type: gpr_clock_type) -> gpr_timespec;
}
extern "C" {
    pub fn gpr_time_to_millis(timespec: gpr_timespec) -> i32;
}
extern "C" {
    #[doc = " Return 1 if two times are equal or within threshold of each other,\n0 otherwise"]
    pub fn gpr_time_similar(
        a: gpr_timespec,
        b: gpr_timespec,
        threshold: gpr_timespec,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Sleep until at least 'until' - an absolute timeout"]
    pub fn gpr_sleep_until(until: gpr_timespec);
}
extern "C" {
    pub fn gpr_timespec_to_micros(t: gpr_timespec) -> f64;
}
pub type gpr_atm = isize;
extern "C" {
    #[doc = " Adds \\a delta to \\a *value, clamping the result to the range specified\nby \\a min and \\a max.  Returns the new value."]
    pub fn gpr_atm_no_barrier_clamped_add(
        value: *mut gpr_atm,
        delta: gpr_atm,
        min: gpr_atm,
        max: gpr_atm,
    ) -> gpr_atm;
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct gpr_event {
    pub state: gpr_atm,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct gpr_refcount {
    pub count: gpr_atm,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct gpr_stats_counter {
    pub value: gpr_atm,
}
extern "C" {
    #[doc = " Initialize *ev."]
    pub fn gpr_event_init(ev: *mut gpr_event);
}
extern "C" {
    #[doc = " Set *ev so that gpr_event_get() and gpr_event_wait() will return value.\nRequires:  *ev initialized; value != NULL; no prior or concurrent calls to\ngpr_event_set(ev, ...) since initialization."]
    pub fn gpr_event_set(ev: *mut gpr_event, value: *mut ::std::os::raw::c_void);
}
extern "C" {
    #[doc = " Return the value set by gpr_event_set(ev, ...), or NULL if no such call has\ncompleted.  If the result is non-NULL, all operations that occurred prior to\nthe gpr_event_set(ev, ...) set will be visible after this call returns.\nRequires:  *ev initialized.  This operation is faster than acquiring a mutex\non most platforms."]
    pub fn gpr_event_get(ev: *mut gpr_event) -> *mut ::std::os::raw::c_void;
}
extern "C" {
    #[doc = " Wait until *ev is set by gpr_event_set(ev, ...), or abs_deadline is\nexceeded, then return gpr_event_get(ev).  Requires:  *ev initialized.  Use\nabs_deadline==gpr_inf_future for no deadline.  When the event has been\nsignalled before the call, this operation is faster than acquiring a mutex\non most platforms."]
    pub fn gpr_event_wait(
        ev: *mut gpr_event,
        abs_deadline: gpr_timespec,
    ) -> *mut ::std::os::raw::c_void;
}
extern "C" {
    #[doc = " Initialize *r to value n."]
    pub fn gpr_ref_init(r: *mut gpr_refcount, n: ::std::os::raw::c_int);
}
extern "C" {
    #[doc = " Increment the reference count *r.  Requires *r initialized."]
    pub fn gpr_ref(r: *mut gpr_refcount);
}
extern "C" {
    #[doc = " Increment the reference count *r.  Requires *r initialized.\nCrashes if refcount is zero"]
    pub fn gpr_ref_non_zero(r: *mut gpr_refcount);
}
extern "C" {
    #[doc = " Increment the reference count *r by n.  Requires *r initialized, n > 0."]
    pub fn gpr_refn(r: *mut gpr_refcount, n: ::std::os::raw::c_int);
}
extern "C" {
    #[doc = " Decrement the reference count *r and return non-zero iff it has reached\nzero. .  Requires *r initialized."]
    pub fn gpr_unref(r: *mut gpr_refcount) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Return non-zero iff the reference count of *r is one, and thus is owned\nby exactly one object."]
    pub fn gpr_ref_is_unique(r: *mut gpr_refcount) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Initialize *c to the value n."]
    pub fn gpr_stats_init(c: *mut gpr_stats_counter, n: isize);
}
extern "C" {
    #[doc = " *c += inc.  Requires: *c initialized."]
    pub fn gpr_stats_inc(c: *mut gpr_stats_counter, inc: isize);
}
extern "C" {
    #[doc = " Return *c.  Requires: *c initialized."]
    pub fn gpr_stats_read(c: *const gpr_stats_counter) -> isize;
}
extern "C" {
    #[doc = " Increment the refcount of s. Requires slice is initialized.\nReturns s."]
    pub fn grpc_slice_ref(s: grpc_slice) -> grpc_slice;
}
extern "C" {
    #[doc = " Decrement the ref count of s.  If the ref count of s reaches zero, all\nslices sharing the ref count are destroyed, and considered no longer\ninitialized.  If s is ultimately derived from a call to grpc_slice_new(start,\nlen, dest) where dest!=NULL , then (*dest)(start) is called, else if s is\nultimately derived from a call to grpc_slice_new_with_len(start, len, dest)\nwhere dest!=NULL , then (*dest)(start, len).  Requires s initialized."]
    pub fn grpc_slice_unref(s: grpc_slice);
}
extern "C" {
    #[doc = " Copy slice - create a new slice that contains the same data as s"]
    pub fn grpc_slice_copy(s: grpc_slice) -> grpc_slice;
}
extern "C" {
    #[doc = " Create a slice pointing at some data. Calls malloc to allocate a refcount\nfor the object, and arranges that destroy will be called with the pointer\npassed in at destruction."]
    pub fn grpc_slice_new(
        p: *mut ::std::os::raw::c_void,
        len: usize,
        destroy: ::std::option::Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>,
    ) -> grpc_slice;
}
extern "C" {
    #[doc = " Equivalent to grpc_slice_new, but with a separate pointer that is\npassed to the destroy function.  This function can be useful when\nthe data is part of a larger structure that must be destroyed when\nthe data is no longer needed."]
    pub fn grpc_slice_new_with_user_data(
        p: *mut ::std::os::raw::c_void,
        len: usize,
        destroy: ::std::option::Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>,
        user_data: *mut ::std::os::raw::c_void,
    ) -> grpc_slice;
}
extern "C" {
    #[doc = " Equivalent to grpc_slice_new, but with a two argument destroy function that\nalso takes the slice length."]
    pub fn grpc_slice_new_with_len(
        p: *mut ::std::os::raw::c_void,
        len: usize,
        destroy: ::std::option::Option<
            unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void, arg2: usize),
        >,
    ) -> grpc_slice;
}
extern "C" {
    #[doc = " Equivalent to grpc_slice_new(malloc(len), len, free), but saves one malloc()\ncall.\nAborts if malloc() fails."]
    pub fn grpc_slice_malloc(length: usize) -> grpc_slice;
}
extern "C" {
    pub fn grpc_slice_malloc_large(length: usize) -> grpc_slice;
}
extern "C" {
    #[doc = " Create a slice by copying a string.\nDoes not preserve null terminators.\nEquivalent to:\nsize_t len = strlen(source);\ngrpc_slice slice = grpc_slice_malloc(len);\nmemcpy(slice->data, source, len);"]
    pub fn grpc_slice_from_copied_string(source: *const ::std::os::raw::c_char) -> grpc_slice;
}
extern "C" {
    #[doc = " Create a slice by copying a buffer.\nEquivalent to:\ngrpc_slice slice = grpc_slice_malloc(len);\nmemcpy(slice->data, source, len);"]
    pub fn grpc_slice_from_copied_buffer(
        source: *const ::std::os::raw::c_char,
        len: usize,
    ) -> grpc_slice;
}
extern "C" {
    #[doc = " Create a slice pointing to constant memory"]
    pub fn grpc_slice_from_static_string(source: *const ::std::os::raw::c_char) -> grpc_slice;
}
extern "C" {
    #[doc = " Create a slice pointing to constant memory"]
    pub fn grpc_slice_from_static_buffer(
        source: *const ::std::os::raw::c_void,
        len: usize,
    ) -> grpc_slice;
}
extern "C" {
    #[doc = " Return a result slice derived from s, which shares a ref count with \\a s,\nwhere result.data==s.data+begin, and result.length==end-begin. The ref count\nof \\a s is increased by one. Do not assign result back to \\a s.\nRequires s initialized, begin <= end, begin <= s.length, and\nend <= source->length."]
    pub fn grpc_slice_sub(s: grpc_slice, begin: usize, end: usize) -> grpc_slice;
}
extern "C" {
    #[doc = " The same as grpc_slice_sub, but without altering the ref count"]
    pub fn grpc_slice_sub_no_ref(s: grpc_slice, begin: usize, end: usize) -> grpc_slice;
}
extern "C" {
    #[doc = " Splits s into two: modifies s to be s[0:split], and returns a new slice,\nsharing a refcount with s, that contains s[split:s.length].\nRequires s initialized, split <= s.length"]
    pub fn grpc_slice_split_tail(s: *mut grpc_slice, split: usize) -> grpc_slice;
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_slice_ref_whom {
    GRPC_SLICE_REF_TAIL = 1,
    GRPC_SLICE_REF_HEAD = 2,
    GRPC_SLICE_REF_BOTH = 3,
}
extern "C" {
    #[doc = " The same as grpc_slice_split_tail, but with an option to skip altering\n refcounts (grpc_slice_split_tail_maybe_ref(..., true) is equivalent to\n grpc_slice_split_tail(...))"]
    pub fn grpc_slice_split_tail_maybe_ref(
        s: *mut grpc_slice,
        split: usize,
        ref_whom: grpc_slice_ref_whom,
    ) -> grpc_slice;
}
extern "C" {
    #[doc = " Splits s into two: modifies s to be s[split:s.length], and returns a new\nslice, sharing a refcount with s, that contains s[0:split].\nRequires s initialized, split <= s.length"]
    pub fn grpc_slice_split_head(s: *mut grpc_slice, split: usize) -> grpc_slice;
}
extern "C" {
    pub fn grpc_empty_slice() -> grpc_slice;
}
extern "C" {
    pub fn grpc_slice_eq(a: grpc_slice, b: grpc_slice) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Returns <0 if a < b, ==0 if a == b, >0 if a > b\nThe order is arbitrary, and is not guaranteed to be stable across different\nversions of the API."]
    pub fn grpc_slice_cmp(a: grpc_slice, b: grpc_slice) -> ::std::os::raw::c_int;
}
extern "C" {
    pub fn grpc_slice_str_cmp(
        a: grpc_slice,
        b: *const ::std::os::raw::c_char,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " return non-zero if the first blen bytes of a are equal to b"]
    pub fn grpc_slice_buf_start_eq(
        a: grpc_slice,
        b: *const ::std::os::raw::c_void,
        blen: usize,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " return the index of the last instance of \\a c in \\a s, or -1 if not found"]
    pub fn grpc_slice_rchr(s: grpc_slice, c: ::std::os::raw::c_char) -> ::std::os::raw::c_int;
}
extern "C" {
    pub fn grpc_slice_chr(s: grpc_slice, c: ::std::os::raw::c_char) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " return the index of the first occurrence of \\a needle in \\a haystack, or -1\nif it's not found"]
    pub fn grpc_slice_slice(haystack: grpc_slice, needle: grpc_slice) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Do two slices point at the same memory, with the same length\nIf a or b is inlined, actually compares data"]
    pub fn grpc_slice_is_equivalent(a: grpc_slice, b: grpc_slice) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Return a slice pointing to newly allocated memory that has the same contents\n as \\a s"]
    pub fn grpc_slice_dup(a: grpc_slice) -> grpc_slice;
}
extern "C" {
    #[doc = " Return a copy of slice as a C string. Offers no protection against embedded\nNULL's. Returned string must be freed with gpr_free."]
    pub fn grpc_slice_to_c_string(s: grpc_slice) -> *mut ::std::os::raw::c_char;
}
pub mod grpc_status_code {
    pub type Type = ::std::os::raw::c_int;
    #[doc = " Not an error; returned on success"]
    pub const GRPC_STATUS_OK: Type = 0;
    #[doc = " The operation was cancelled (typically by the caller)."]
    pub const GRPC_STATUS_CANCELLED: Type = 1;
    #[doc = " Unknown error.  An example of where this error may be returned is\nif a Status value received from another address space belongs to\nan error-space that is not known in this address space.  Also\nerrors raised by APIs that do not return enough error information\nmay be converted to this error."]
    pub const GRPC_STATUS_UNKNOWN: Type = 2;
    #[doc = " Client specified an invalid argument.  Note that this differs\nfrom FAILED_PRECONDITION.  INVALID_ARGUMENT indicates arguments\nthat are problematic regardless of the state of the system\n(e.g., a malformed file name)."]
    pub const GRPC_STATUS_INVALID_ARGUMENT: Type = 3;
    #[doc = " Deadline expired before operation could complete.  For operations\nthat change the state of the system, this error may be returned\neven if the operation has completed successfully.  For example, a\nsuccessful response from a server could have been delayed long\nenough for the deadline to expire."]
    pub const GRPC_STATUS_DEADLINE_EXCEEDED: Type = 4;
    #[doc = " Some requested entity (e.g., file or directory) was not found."]
    pub const GRPC_STATUS_NOT_FOUND: Type = 5;
    #[doc = " Some entity that we attempted to create (e.g., file or directory)\nalready exists."]
    pub const GRPC_STATUS_ALREADY_EXISTS: Type = 6;
    #[doc = " The caller does not have permission to execute the specified\noperation.  PERMISSION_DENIED must not be used for rejections\ncaused by exhausting some resource (use RESOURCE_EXHAUSTED\ninstead for those errors).  PERMISSION_DENIED must not be\nused if the caller can not be identified (use UNAUTHENTICATED\ninstead for those errors)."]
    pub const GRPC_STATUS_PERMISSION_DENIED: Type = 7;
    #[doc = " The request does not have valid authentication credentials for the\noperation."]
    pub const GRPC_STATUS_UNAUTHENTICATED: Type = 16;
    #[doc = " Some resource has been exhausted, perhaps a per-user quota, or\nperhaps the entire file system is out of space."]
    pub const GRPC_STATUS_RESOURCE_EXHAUSTED: Type = 8;
    #[doc = " Operation was rejected because the system is not in a state\nrequired for the operation's execution.  For example, directory\nto be deleted may be non-empty, an rmdir operation is applied to\na non-directory, etc.\n\nA litmus test that may help a service implementor in deciding\nbetween FAILED_PRECONDITION, ABORTED, and UNAVAILABLE:\n(a) Use UNAVAILABLE if the client can retry just the failing call.\n(b) Use ABORTED if the client should retry at a higher-level\n(e.g., restarting a read-modify-write sequence).\n(c) Use FAILED_PRECONDITION if the client should not retry until\nthe system state has been explicitly fixed.  E.g., if an \"rmdir\"\nfails because the directory is non-empty, FAILED_PRECONDITION\nshould be returned since the client should not retry unless\nthey have first fixed up the directory by deleting files from it.\n(d) Use FAILED_PRECONDITION if the client performs conditional\nREST Get/Update/Delete on a resource and the resource on the\nserver does not match the condition. E.g., conflicting\nread-modify-write on the same resource."]
    pub const GRPC_STATUS_FAILED_PRECONDITION: Type = 9;
    #[doc = " The operation was aborted, typically due to a concurrency issue\nlike sequencer check failures, transaction aborts, etc.\n\nSee litmus test above for deciding between FAILED_PRECONDITION,\nABORTED, and UNAVAILABLE."]
    pub const GRPC_STATUS_ABORTED: Type = 10;
    #[doc = " Operation was attempted past the valid range.  E.g., seeking or\nreading past end of file.\n\nUnlike INVALID_ARGUMENT, this error indicates a problem that may\nbe fixed if the system state changes. For example, a 32-bit file\nsystem will generate INVALID_ARGUMENT if asked to read at an\noffset that is not in the range [0,2^32-1], but it will generate\nOUT_OF_RANGE if asked to read from an offset past the current\nfile size.\n\nThere is a fair bit of overlap between FAILED_PRECONDITION and\nOUT_OF_RANGE.  We recommend using OUT_OF_RANGE (the more specific\nerror) when it applies so that callers who are iterating through\na space can easily look for an OUT_OF_RANGE error to detect when\nthey are done."]
    pub const GRPC_STATUS_OUT_OF_RANGE: Type = 11;
    #[doc = " Operation is not implemented or not supported/enabled in this service."]
    pub const GRPC_STATUS_UNIMPLEMENTED: Type = 12;
    #[doc = " Internal errors.  Means some invariants expected by underlying\nsystem has been broken.  If you see one of these errors,\nsomething is very broken."]
    pub const GRPC_STATUS_INTERNAL: Type = 13;
    #[doc = " The service is currently unavailable.  This is a most likely a\ntransient condition and may be corrected by retrying with\na backoff. Note that it is not always safe to retry non-idempotent\noperations.\n\nWARNING: Although data MIGHT not have been transmitted when this\nstatus occurs, there is NOT A GUARANTEE that the server has not seen\nanything. So in general it is unsafe to retry on this status code\nif the call is non-idempotent.\n\nSee litmus test above for deciding between FAILED_PRECONDITION,\nABORTED, and UNAVAILABLE."]
    pub const GRPC_STATUS_UNAVAILABLE: Type = 14;
    #[doc = " Unrecoverable data loss or corruption."]
    pub const GRPC_STATUS_DATA_LOSS: Type = 15;
    #[doc = " Force users to include a default branch:"]
    pub const GRPC_STATUS__DO_NOT_USE: Type = -1;
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_byte_buffer_type {
    GRPC_BB_RAW = 0,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpc_byte_buffer {
    pub reserved: *mut ::std::os::raw::c_void,
    pub type_: grpc_byte_buffer_type,
    pub data: grpc_byte_buffer_grpc_byte_buffer_data,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union grpc_byte_buffer_grpc_byte_buffer_data {
    pub reserved: grpc_byte_buffer_grpc_byte_buffer_data__bindgen_ty_1,
    pub raw: grpc_byte_buffer_grpc_byte_buffer_data_grpc_compressed_buffer,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_byte_buffer_grpc_byte_buffer_data__bindgen_ty_1 {
    pub reserved: [*mut ::std::os::raw::c_void; 8usize],
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpc_byte_buffer_grpc_byte_buffer_data_grpc_compressed_buffer {
    pub compression: grpc_compression_algorithm,
    pub slice_buffer: grpc_slice_buffer,
}
impl ::std::fmt::Debug for grpc_byte_buffer_grpc_byte_buffer_data_grpc_compressed_buffer {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write ! (f , "grpc_byte_buffer_grpc_byte_buffer_data_grpc_compressed_buffer {{ compression: {:?}, slice_buffer: {:?} }}" , self . compression , self . slice_buffer)
    }
}
impl ::std::fmt::Debug for grpc_byte_buffer_grpc_byte_buffer_data {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(f, "grpc_byte_buffer_grpc_byte_buffer_data {{ union }}")
    }
}
impl ::std::fmt::Debug for grpc_byte_buffer {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(
            f,
            "grpc_byte_buffer {{ reserved: {:?}, type: {:?}, data: {:?} }}",
            self.reserved, self.type_, self.data
        )
    }
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_completion_queue {
    _unused: [u8; 0],
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_channel {
    _unused: [u8; 0],
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_server {
    _unused: [u8; 0],
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_call {
    _unused: [u8; 0],
}
#[repr(u32)]
#[doc = " Type specifier for grpc_arg"]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_arg_type {
    GRPC_ARG_STRING = 0,
    GRPC_ARG_INTEGER = 1,
    GRPC_ARG_POINTER = 2,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_arg_pointer_vtable {
    pub copy: ::std::option::Option<
        unsafe extern "C" fn(p: *mut ::std::os::raw::c_void) -> *mut ::std::os::raw::c_void,
    >,
    pub destroy: ::std::option::Option<unsafe extern "C" fn(p: *mut ::std::os::raw::c_void)>,
    pub cmp: ::std::option::Option<
        unsafe extern "C" fn(
            p: *mut ::std::os::raw::c_void,
            q: *mut ::std::os::raw::c_void,
        ) -> ::std::os::raw::c_int,
    >,
}
#[doc = " A single argument... each argument has a key and a value\n\nA note on naming keys:\nKeys are namespaced into groups, usually grouped by library, and are\nkeys for module XYZ are named XYZ.key1, XYZ.key2, etc. Module names must\nbe restricted to the regex [A-Za-z][_A-Za-z0-9]{,15}.\nKey names must be restricted to the regex [A-Za-z][_A-Za-z0-9]{,47}.\n\nGRPC core library keys are prefixed by grpc.\n\nLibrary authors are strongly encouraged to \\#define symbolic constants for\ntheir keys so that it's possible to change them in the future."]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpc_arg {
    pub type_: grpc_arg_type,
    pub key: *mut ::std::os::raw::c_char,
    pub value: grpc_arg_grpc_arg_value,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union grpc_arg_grpc_arg_value {
    pub string: *mut ::std::os::raw::c_char,
    pub integer: ::std::os::raw::c_int,
    pub pointer: grpc_arg_grpc_arg_value_grpc_arg_pointer,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_arg_grpc_arg_value_grpc_arg_pointer {
    pub p: *mut ::std::os::raw::c_void,
    pub vtable: *const grpc_arg_pointer_vtable,
}
impl ::std::fmt::Debug for grpc_arg_grpc_arg_value {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(f, "grpc_arg_grpc_arg_value {{ union }}")
    }
}
impl ::std::fmt::Debug for grpc_arg {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(
            f,
            "grpc_arg {{ type: {:?}, key: {:?}, value: {:?} }}",
            self.type_, self.key, self.value
        )
    }
}
#[doc = " An array of arguments that can be passed around.\n\nUsed to set optional channel-level configuration.\nThese configuration options are modelled as key-value pairs as defined\nby grpc_arg; keys are strings to allow easy backwards-compatible extension\nby arbitrary parties. All evaluation is performed at channel creation\ntime (i.e. the keys and values in this structure need only live through the\ncreation invocation).\n\nHowever, if one of the args has grpc_arg_type==GRPC_ARG_POINTER, then the\ngrpc_arg_pointer_vtable must live until the channel args are done being\nused by core (i.e. when the object for use with which they were passed\nis destroyed).\n\nSee the description of the \\ref grpc_arg_keys \"available args\" for more\ndetails."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_channel_args {
    pub num_args: usize,
    pub args: *mut grpc_arg,
}
#[repr(u32)]
#[doc = " Result of a grpc call. If the caller satisfies the prerequisites of a\nparticular operation, the grpc_call_error returned will be GRPC_CALL_OK.\nReceiving any other value listed here is an indication of a bug in the\ncaller."]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_call_error {
    #[doc = " everything went ok"]
    GRPC_CALL_OK = 0,
    #[doc = " something failed, we don't know what"]
    GRPC_CALL_ERROR = 1,
    #[doc = " this method is not available on the server"]
    GRPC_CALL_ERROR_NOT_ON_SERVER = 2,
    #[doc = " this method is not available on the client"]
    GRPC_CALL_ERROR_NOT_ON_CLIENT = 3,
    #[doc = " this method must be called before server_accept"]
    GRPC_CALL_ERROR_ALREADY_ACCEPTED = 4,
    #[doc = " this method must be called before invoke"]
    GRPC_CALL_ERROR_ALREADY_INVOKED = 5,
    #[doc = " this method must be called after invoke"]
    GRPC_CALL_ERROR_NOT_INVOKED = 6,
    #[doc = " this call is already finished\n(writes_done or write_status has already been called)"]
    GRPC_CALL_ERROR_ALREADY_FINISHED = 7,
    #[doc = " there is already an outstanding read/write operation on the call"]
    GRPC_CALL_ERROR_TOO_MANY_OPERATIONS = 8,
    #[doc = " the flags value was illegal for this call"]
    GRPC_CALL_ERROR_INVALID_FLAGS = 9,
    #[doc = " invalid metadata was passed to this call"]
    GRPC_CALL_ERROR_INVALID_METADATA = 10,
    #[doc = " invalid message was passed to this call"]
    GRPC_CALL_ERROR_INVALID_MESSAGE = 11,
    #[doc = " completion queue for notification has not been registered\n with the server"]
    GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE = 12,
    #[doc = " this batch of operations leads to more operations than allowed"]
    GRPC_CALL_ERROR_BATCH_TOO_BIG = 13,
    #[doc = " payload type requested is not the type registered"]
    GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH = 14,
    #[doc = " completion queue has been shutdown"]
    GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN = 15,
}
#[doc = " A single metadata element"]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpc_metadata {
    #[doc = " the key, value values are expected to line up with grpc_mdelem: if\nchanging them, update metadata.h at the same time."]
    pub key: grpc_slice,
    pub value: grpc_slice,
    pub internal_data: grpc_metadata__bindgen_ty_1,
}
#[doc = " The following fields are reserved for grpc internal use.\nThere is no need to initialize them, and they will be set to garbage\nduring calls to grpc."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_metadata__bindgen_ty_1 {
    pub obfuscated: [*mut ::std::os::raw::c_void; 4usize],
}
impl ::std::fmt::Debug for grpc_metadata {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(
            f,
            "grpc_metadata {{ key: {:?}, value: {:?}, internal_data: {:?} }}",
            self.key, self.value, self.internal_data
        )
    }
}
#[repr(u32)]
#[doc = " The type of completion (for grpc_event)"]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_completion_type {
    #[doc = " Shutting down"]
    GRPC_QUEUE_SHUTDOWN = 0,
    #[doc = " No event before timeout"]
    GRPC_QUEUE_TIMEOUT = 1,
    #[doc = " Operation completion"]
    GRPC_OP_COMPLETE = 2,
}
#[doc = " The result of an operation.\n\nReturned by a completion queue when the operation started with tag."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_event {
    #[doc = " The type of the completion."]
    pub type_: grpc_completion_type,
    #[doc = " If the grpc_completion_type is GRPC_OP_COMPLETE, this field indicates\nwhether the operation was successful or not; 0 in case of failure and\nnon-zero in case of success.\nIf grpc_completion_type is GRPC_QUEUE_SHUTDOWN or GRPC_QUEUE_TIMEOUT, this\nfield is guaranteed to be 0"]
    pub success: ::std::os::raw::c_int,
    #[doc = " The tag passed to grpc_call_start_batch etc to start this operation.\nOnly* GRPC_OP_COMPLETE has a tag. For all other grpc_completion_type\nvalues, tag is uninitialized."]
    pub tag: *mut ::std::os::raw::c_void,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_metadata_array {
    pub count: usize,
    pub capacity: usize,
    pub metadata: *mut grpc_metadata,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpc_call_details {
    pub method: grpc_slice,
    pub host: grpc_slice,
    pub deadline: gpr_timespec,
}
impl ::std::fmt::Debug for grpc_call_details {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(
            f,
            "grpc_call_details {{ method: {:?}, host: {:?}, deadline: {:?} }}",
            self.method, self.host, self.deadline
        )
    }
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_op_type {
    #[doc = " Send initial metadata: one and only one instance MUST be sent for each\ncall, unless the call was cancelled - in which case this can be skipped.\nThis op completes after all bytes of metadata have been accepted by\noutgoing flow control."]
    GRPC_OP_SEND_INITIAL_METADATA = 0,
    #[doc = " Send a message: 0 or more of these operations can occur for each call.\nThis op completes after all bytes for the message have been accepted by\noutgoing flow control."]
    GRPC_OP_SEND_MESSAGE = 1,
    #[doc = " Send a close from the client: one and only one instance MUST be sent from\nthe client, unless the call was cancelled - in which case this can be\nskipped. This op completes after all bytes for the call\n(including the close) have passed outgoing flow control."]
    GRPC_OP_SEND_CLOSE_FROM_CLIENT = 2,
    #[doc = " Send status from the server: one and only one instance MUST be sent from\nthe server unless the call was cancelled - in which case this can be\nskipped. This op completes after all bytes for the call\n(including the status) have passed outgoing flow control."]
    GRPC_OP_SEND_STATUS_FROM_SERVER = 3,
    #[doc = " Receive initial metadata: one and only one MUST be made on the client,\nmust not be made on the server.\nThis op completes after all initial metadata has been read from the\npeer."]
    GRPC_OP_RECV_INITIAL_METADATA = 4,
    #[doc = " Receive a message: 0 or more of these operations can occur for each call.\nThis op completes after all bytes of the received message have been\nread, or after a half-close has been received on this call."]
    GRPC_OP_RECV_MESSAGE = 5,
    #[doc = " Receive status on the client: one and only one must be made on the client.\nThis operation always succeeds, meaning ops paired with this operation\nwill also appear to succeed, even though they may not have. In that case\nthe status will indicate some failure.\nThis op completes after all activity on the call has completed."]
    GRPC_OP_RECV_STATUS_ON_CLIENT = 6,
    #[doc = " Receive close on the server: one and only one must be made on the\nserver. This op completes after the close has been received by the\nserver. This operation always succeeds, meaning ops paired with\nthis operation will also appear to succeed, even though they may not\nhave."]
    GRPC_OP_RECV_CLOSE_ON_SERVER = 7,
}
#[doc = " Operation data: one field for each op type (except SEND_CLOSE_FROM_CLIENT\nwhich has no arguments)"]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpc_op {
    #[doc = " Operation type, as defined by grpc_op_type"]
    pub op: grpc_op_type,
    #[doc = " Write flags bitset for grpc_begin_messages"]
    pub flags: u32,
    #[doc = " Reserved for future usage"]
    pub reserved: *mut ::std::os::raw::c_void,
    pub data: grpc_op_grpc_op_data,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union grpc_op_grpc_op_data {
    pub reserved: grpc_op_grpc_op_data__bindgen_ty_1,
    pub send_initial_metadata: grpc_op_grpc_op_data_grpc_op_send_initial_metadata,
    pub send_message: grpc_op_grpc_op_data_grpc_op_send_message,
    pub send_status_from_server: grpc_op_grpc_op_data_grpc_op_send_status_from_server,
    pub recv_initial_metadata: grpc_op_grpc_op_data_grpc_op_recv_initial_metadata,
    pub recv_message: grpc_op_grpc_op_data_grpc_op_recv_message,
    pub recv_status_on_client: grpc_op_grpc_op_data_grpc_op_recv_status_on_client,
    pub recv_close_on_server: grpc_op_grpc_op_data_grpc_op_recv_close_on_server,
}
#[doc = " Reserved for future usage"]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_op_grpc_op_data__bindgen_ty_1 {
    pub reserved: [*mut ::std::os::raw::c_void; 8usize],
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_op_grpc_op_data_grpc_op_send_initial_metadata { pub count : usize , pub metadata : * mut grpc_metadata , pub maybe_compression_level : grpc_op_grpc_op_data_grpc_op_send_initial_metadata_grpc_op_send_initial_metadata_maybe_compression_level , }
#[doc = " If \\a is_set, \\a compression_level will be used for the call.\n Otherwise, \\a compression_level won't be considered"]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_op_grpc_op_data_grpc_op_send_initial_metadata_grpc_op_send_initial_metadata_maybe_compression_level
{
    pub is_set: u8,
    pub level: grpc_compression_level,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_op_grpc_op_data_grpc_op_send_message {
    #[doc = " This op takes ownership of the slices in send_message.  After\n a call completes, the contents of send_message are not guaranteed\n and likely empty.  The original owner should still call\n grpc_byte_buffer_destroy() on this object however."]
    pub send_message: *mut grpc_byte_buffer,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_op_grpc_op_data_grpc_op_send_status_from_server {
    pub trailing_metadata_count: usize,
    pub trailing_metadata: *mut grpc_metadata,
    pub status: grpc_status_code::Type,
    #[doc = " optional: set to NULL if no details need sending, non-NULL if they do\n pointer will not be retained past the start_batch call"]
    pub status_details: *mut grpc_slice,
}
#[doc = " ownership of the array is with the caller, but ownership of the elements\nstays with the call object (ie key, value members are owned by the call\nobject, recv_initial_metadata->array is owned by the caller).\nAfter the operation completes, call grpc_metadata_array_destroy on this\nvalue, or reuse it in a future op."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_op_grpc_op_data_grpc_op_recv_initial_metadata {
    pub recv_initial_metadata: *mut grpc_metadata_array,
}
#[doc = " ownership of the byte buffer is moved to the caller; the caller must\ncall grpc_byte_buffer_destroy on this value, or reuse it in a future op.\nThe returned byte buffer will be NULL if trailing metadata was\nreceived instead of a message."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_op_grpc_op_data_grpc_op_recv_message {
    pub recv_message: *mut *mut grpc_byte_buffer,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_op_grpc_op_data_grpc_op_recv_status_on_client {
    #[doc = " ownership of the array is with the caller, but ownership of the\nelements stays with the call object (ie key, value members are owned\nby the call object, trailing_metadata->array is owned by the caller).\nAfter the operation completes, call grpc_metadata_array_destroy on\nthis value, or reuse it in a future op."]
    pub trailing_metadata: *mut grpc_metadata_array,
    pub status: *mut grpc_status_code::Type,
    pub status_details: *mut grpc_slice,
    #[doc = " If this is not nullptr, it will be populated with the full fidelity\n error string for debugging purposes. The application is responsible\n for freeing the data by using gpr_free()."]
    pub error_string: *mut *const ::std::os::raw::c_char,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_op_grpc_op_data_grpc_op_recv_close_on_server {
    #[doc = " out argument, set to 1 if the call failed at the server for\na reason other than a non-OK status (cancel, deadline\nexceeded, network failure, etc.), 0 otherwise (RPC processing ran to\ncompletion and was able to provide any status from the server)"]
    pub cancelled: *mut ::std::os::raw::c_int,
}
impl ::std::fmt::Debug for grpc_op_grpc_op_data {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(f, "grpc_op_grpc_op_data {{ union }}")
    }
}
impl ::std::fmt::Debug for grpc_op {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(
            f,
            "grpc_op {{ op: {:?}, reserved: {:?}, data: {:?} }}",
            self.op, self.reserved, self.data
        )
    }
}
#[doc = " Information requested from the channel."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_channel_info {
    #[doc = " If non-NULL, will be set to point to a string indicating the LB\n policy name.  Caller takes ownership."]
    pub lb_policy_name: *mut *mut ::std::os::raw::c_char,
    #[doc = " If non-NULL, will be set to point to a string containing the\n service config used by the channel in JSON form."]
    pub service_config_json: *mut *mut ::std::os::raw::c_char,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_resource_quota {
    _unused: [u8; 0],
}
#[repr(u32)]
#[doc = " Completion queues internally MAY maintain a set of file descriptors in a\nstructure called 'pollset'. This enum specifies if a completion queue has an\nassociated pollset and any restrictions on the type of file descriptors that\ncan be present in the pollset.\n\nI/O progress can only be made when grpc_completion_queue_next() or\ngrpc_completion_queue_pluck() are called on the completion queue (unless the\ngrpc_cq_polling_type is GRPC_CQ_NON_POLLING) and hence it is very important\nto actively call these APIs"]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_cq_polling_type {
    #[doc = " The completion queue will have an associated pollset and there is no\nrestriction on the type of file descriptors the pollset may contain"]
    GRPC_CQ_DEFAULT_POLLING = 0,
    #[doc = " Similar to GRPC_CQ_DEFAULT_POLLING except that the completion queues will\nnot contain any 'listening file descriptors' (i.e file descriptors used to\nlisten to incoming channels)"]
    GRPC_CQ_NON_LISTENING = 1,
    #[doc = " The completion queue will not have an associated pollset. Note that\ngrpc_completion_queue_next() or grpc_completion_queue_pluck() MUST still\nbe called to pop events from the completion queue; it is not required to\ncall them actively to make I/O progress"]
    GRPC_CQ_NON_POLLING = 2,
}
#[repr(u32)]
#[doc = " Specifies the type of APIs to use to pop events from the completion queue"]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_cq_completion_type {
    #[doc = " Events are popped out by calling grpc_completion_queue_next() API ONLY"]
    GRPC_CQ_NEXT = 0,
    #[doc = " Events are popped out by calling grpc_completion_queue_pluck() API ONLY"]
    GRPC_CQ_PLUCK = 1,
    #[doc = " Events trigger a callback specified as the tag"]
    GRPC_CQ_CALLBACK = 2,
}
#[doc = " Specifies an interface class to be used as a tag for callback-based\n completion queues. This can be used directly, as the first element of a\n struct in C, or as a base class in C++. Its \"run\" value should be assigned to\n some non-member function, such as a static method."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_completion_queue_functor {
    #[doc = " The run member specifies a function that will be called when this\ntag is extracted from the completion queue. Its arguments will be a\npointer to this functor and a boolean that indicates whether the\noperation succeeded (non-zero) or failed (zero)"]
    pub functor_run: ::std::option::Option<
        unsafe extern "C" fn(arg1: *mut grpc_completion_queue_functor, arg2: ::std::os::raw::c_int),
    >,
    #[doc = " The inlineable member specifies whether this functor can be run inline.\nThis should only be used for trivial internally-defined functors."]
    pub inlineable: ::std::os::raw::c_int,
    #[doc = " The following fields are not API. They are meant for internal use."]
    pub internal_success: ::std::os::raw::c_int,
    pub internal_next: *mut grpc_completion_queue_functor,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_completion_queue_attributes {
    #[doc = " The version number of this structure. More fields might be added to this\nstructure in future."]
    pub version: ::std::os::raw::c_int,
    #[doc = " Set to GRPC_CQ_CURRENT_VERSION"]
    pub cq_completion_type: grpc_cq_completion_type,
    pub cq_polling_type: grpc_cq_polling_type,
    #[doc = " When creating a callbackable CQ, pass in a functor to get invoked when\n shutdown is complete"]
    pub cq_shutdown_cb: *mut grpc_completion_queue_functor,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_completion_queue_factory {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " initialize a slice buffer"]
    pub fn grpc_slice_buffer_init(sb: *mut grpc_slice_buffer);
}
extern "C" {
    #[doc = " destroy a slice buffer - unrefs any held elements"]
    pub fn grpc_slice_buffer_destroy(sb: *mut grpc_slice_buffer);
}
extern "C" {
    #[doc = " Add an element to a slice buffer - takes ownership of the slice.\nThis function is allowed to concatenate the passed in slice to the end of\nsome other slice if desired by the slice buffer."]
    pub fn grpc_slice_buffer_add(sb: *mut grpc_slice_buffer, slice: grpc_slice);
}
extern "C" {
    #[doc = " add an element to a slice buffer - takes ownership of the slice and returns\nthe index of the slice.\nGuarantees that the slice will not be concatenated at the end of another\nslice (i.e. the data for this slice will begin at the first byte of the\nslice at the returned index in sb->slices)\nThe implementation MAY decide to concatenate data at the end of a small\nslice added in this fashion."]
    pub fn grpc_slice_buffer_add_indexed(sb: *mut grpc_slice_buffer, slice: grpc_slice) -> usize;
}
extern "C" {
    pub fn grpc_slice_buffer_addn(sb: *mut grpc_slice_buffer, slices: *mut grpc_slice, n: usize);
}
extern "C" {
    #[doc = " add a very small (less than 8 bytes) amount of data to the end of a slice\nbuffer: returns a pointer into which to add the data"]
    pub fn grpc_slice_buffer_tiny_add(sb: *mut grpc_slice_buffer, len: usize) -> *mut u8;
}
extern "C" {
    #[doc = " pop the last buffer, but don't unref it"]
    pub fn grpc_slice_buffer_pop(sb: *mut grpc_slice_buffer);
}
extern "C" {
    #[doc = " clear a slice buffer, unref all elements"]
    pub fn grpc_slice_buffer_reset_and_unref(sb: *mut grpc_slice_buffer);
}
extern "C" {
    #[doc = " swap the contents of two slice buffers"]
    pub fn grpc_slice_buffer_swap(a: *mut grpc_slice_buffer, b: *mut grpc_slice_buffer);
}
extern "C" {
    #[doc = " move all of the elements of src into dst"]
    pub fn grpc_slice_buffer_move_into(src: *mut grpc_slice_buffer, dst: *mut grpc_slice_buffer);
}
extern "C" {
    #[doc = " remove n bytes from the end of a slice buffer"]
    pub fn grpc_slice_buffer_trim_end(
        sb: *mut grpc_slice_buffer,
        n: usize,
        garbage: *mut grpc_slice_buffer,
    );
}
extern "C" {
    #[doc = " move the first n bytes of src into dst"]
    pub fn grpc_slice_buffer_move_first(
        src: *mut grpc_slice_buffer,
        n: usize,
        dst: *mut grpc_slice_buffer,
    );
}
extern "C" {
    #[doc = " move the first n bytes of src into dst without adding references"]
    pub fn grpc_slice_buffer_move_first_no_ref(
        src: *mut grpc_slice_buffer,
        n: usize,
        dst: *mut grpc_slice_buffer,
    );
}
extern "C" {
    #[doc = " move the first n bytes of src into dst (copying them)"]
    pub fn grpc_slice_buffer_move_first_into_buffer(
        src: *mut grpc_slice_buffer,
        n: usize,
        dst: *mut ::std::os::raw::c_void,
    );
}
extern "C" {
    #[doc = " take the first slice in the slice buffer"]
    pub fn grpc_slice_buffer_take_first(sb: *mut grpc_slice_buffer) -> grpc_slice;
}
extern "C" {
    #[doc = " undo the above with (a possibly different) \\a slice"]
    pub fn grpc_slice_buffer_undo_take_first(sb: *mut grpc_slice_buffer, slice: grpc_slice);
}
extern "C" {
    #[doc = " Returns a RAW byte buffer instance over the given slices (up to \\a nslices).\n\n Increases the reference count for all \\a slices processed. The user is\n responsible for invoking grpc_byte_buffer_destroy on the returned instance."]
    pub fn grpc_raw_byte_buffer_create(
        slices: *mut grpc_slice,
        nslices: usize,
    ) -> *mut grpc_byte_buffer;
}
extern "C" {
    #[doc = " Returns a *compressed* RAW byte buffer instance over the given slices (up to\n \\a nslices). The \\a compression argument defines the compression algorithm\n used to generate the data in \\a slices.\n\n Increases the reference count for all \\a slices processed. The user is\n responsible for invoking grpc_byte_buffer_destroy on the returned instance."]
    pub fn grpc_raw_compressed_byte_buffer_create(
        slices: *mut grpc_slice,
        nslices: usize,
        compression: grpc_compression_algorithm,
    ) -> *mut grpc_byte_buffer;
}
extern "C" {
    #[doc = " Copies input byte buffer \\a bb.\n\n Increases the reference count of all the source slices. The user is\n responsible for calling grpc_byte_buffer_destroy over the returned copy."]
    pub fn grpc_byte_buffer_copy(bb: *mut grpc_byte_buffer) -> *mut grpc_byte_buffer;
}
extern "C" {
    #[doc = " Returns the size of the given byte buffer, in bytes."]
    pub fn grpc_byte_buffer_length(bb: *mut grpc_byte_buffer) -> usize;
}
extern "C" {
    #[doc = " Destroys \\a byte_buffer deallocating all its memory."]
    pub fn grpc_byte_buffer_destroy(bb: *mut grpc_byte_buffer);
}
extern "C" {
    #[doc = " Initialize \\a reader to read over \\a buffer.\n Returns 1 upon success, 0 otherwise."]
    pub fn grpc_byte_buffer_reader_init(
        reader: *mut grpc_byte_buffer_reader,
        buffer: *mut grpc_byte_buffer,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Cleanup and destroy \\a reader"]
    pub fn grpc_byte_buffer_reader_destroy(reader: *mut grpc_byte_buffer_reader);
}
extern "C" {
    #[doc = " Updates \\a slice with the next piece of data from from \\a reader and returns\n 1. Returns 0 at the end of the stream. Caller is responsible for calling\n grpc_slice_unref on the result."]
    pub fn grpc_byte_buffer_reader_next(
        reader: *mut grpc_byte_buffer_reader,
        slice: *mut grpc_slice,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - This function may be removed and changed, in the future.\n\n Updates \\a slice with the next piece of data from from \\a reader and returns\n 1. Returns 0 at the end of the stream. Caller is responsible for making sure\n the slice pointer remains valid when accessed.\n\n NOTE: Do not use this function unless the caller can guarantee that the\n       underlying grpc_byte_buffer outlasts the use of the slice. This is only\n       safe when the underlying grpc_byte_buffer remains immutable while slice\n       is being accessed."]
    pub fn grpc_byte_buffer_reader_peek(
        reader: *mut grpc_byte_buffer_reader,
        slice: *mut *mut grpc_slice,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Merge all data from \\a reader into single slice"]
    pub fn grpc_byte_buffer_reader_readall(reader: *mut grpc_byte_buffer_reader) -> grpc_slice;
}
extern "C" {
    #[doc = " Returns a RAW byte buffer instance from the output of \\a reader."]
    pub fn grpc_raw_byte_buffer_from_reader(
        reader: *mut grpc_byte_buffer_reader,
    ) -> *mut grpc_byte_buffer;
}
extern "C" {
    #[doc = " Return if an algorithm is message compression algorithm."]
    pub fn grpc_compression_algorithm_is_message(
        algorithm: grpc_compression_algorithm,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Return if an algorithm is stream compression algorithm."]
    pub fn grpc_compression_algorithm_is_stream(
        algorithm: grpc_compression_algorithm,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Parses the \\a slice as a grpc_compression_algorithm instance and updating \\a\n algorithm. Returns 1 upon success, 0 otherwise."]
    pub fn grpc_compression_algorithm_parse(
        name: grpc_slice,
        algorithm: *mut grpc_compression_algorithm,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Updates \\a name with the encoding name corresponding to a valid \\a\n algorithm. Note that \\a name is statically allocated and must *not* be freed.\n Returns 1 upon success, 0 otherwise."]
    pub fn grpc_compression_algorithm_name(
        algorithm: grpc_compression_algorithm,
        name: *mut *const ::std::os::raw::c_char,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Returns the compression algorithm corresponding to \\a level for the\n compression algorithms encoded in the \\a accepted_encodings bitset."]
    pub fn grpc_compression_algorithm_for_level(
        level: grpc_compression_level,
        accepted_encodings: u32,
    ) -> grpc_compression_algorithm;
}
extern "C" {
    pub fn grpc_compression_options_init(opts: *mut grpc_compression_options);
}
extern "C" {
    #[doc = " Mark \\a algorithm as enabled in \\a opts."]
    pub fn grpc_compression_options_enable_algorithm(
        opts: *mut grpc_compression_options,
        algorithm: grpc_compression_algorithm,
    );
}
extern "C" {
    #[doc = " Mark \\a algorithm as disabled in \\a opts."]
    pub fn grpc_compression_options_disable_algorithm(
        opts: *mut grpc_compression_options,
        algorithm: grpc_compression_algorithm,
    );
}
extern "C" {
    #[doc = " Returns true if \\a algorithm is marked as enabled in \\a opts."]
    pub fn grpc_compression_options_is_algorithm_enabled(
        opts: *const grpc_compression_options,
        algorithm: grpc_compression_algorithm,
    ) -> ::std::os::raw::c_int;
}
#[repr(u32)]
#[doc = " Connectivity state of a channel."]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_connectivity_state {
    #[doc = " channel is idle"]
    GRPC_CHANNEL_IDLE = 0,
    #[doc = " channel is connecting"]
    GRPC_CHANNEL_CONNECTING = 1,
    #[doc = " channel is ready for work"]
    GRPC_CHANNEL_READY = 2,
    #[doc = " channel has seen a failure but expects to recover"]
    GRPC_CHANNEL_TRANSIENT_FAILURE = 3,
    #[doc = " channel has seen a failure that it cannot recover from"]
    GRPC_CHANNEL_SHUTDOWN = 4,
}
extern "C" {
    #[doc = " \\mainpage GRPC Core\n\n The GRPC Core library is a low-level library designed to be wrapped by higher\n level libraries. The top-level API is provided in grpc.h. Security related\n functionality lives in grpc_security.h."]
    pub fn grpc_metadata_array_init(array: *mut grpc_metadata_array);
}
extern "C" {
    pub fn grpc_metadata_array_destroy(array: *mut grpc_metadata_array);
}
extern "C" {
    pub fn grpc_call_details_init(details: *mut grpc_call_details);
}
extern "C" {
    pub fn grpc_call_details_destroy(details: *mut grpc_call_details);
}
extern "C" {
    #[doc = " Initialize the grpc library.\n\nAfter it's called, a matching invocation to grpc_shutdown() is expected.\n\nIt is not safe to call any other grpc functions before calling this.\n(To avoid overhead, little checking is done, and some things may work. We\ndo not warrant that they will continue to do so in future revisions of this\nlibrary)."]
    pub fn grpc_init();
}
extern "C" {
    #[doc = " Shut down the grpc library.\n\nBefore it's called, there should haven been a matching invocation to\ngrpc_init().\n\nThe last call to grpc_shutdown will initiate cleaning up of grpc library\ninternals, which can happen in another thread. Once the clean-up is done,\nno memory is used by grpc, nor are any instructions executing within the\ngrpc library.  Prior to calling, all application owned grpc objects must\nhave been destroyed."]
    pub fn grpc_shutdown();
}
extern "C" {
    #[doc = " EXPERIMENTAL. Returns 1 if the grpc library has been initialized.\nTODO(ericgribkoff) Decide if this should be promoted to non-experimental as\npart of stabilizing the fork support API, as tracked in\nhttps://github.com/grpc/grpc/issues/15334"]
    pub fn grpc_is_initialized() -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " DEPRECATED. Recommend to use grpc_shutdown only"]
    pub fn grpc_shutdown_blocking();
}
extern "C" {
    #[doc = " Return a string representing the current version of grpc"]
    pub fn grpc_version_string() -> *const ::std::os::raw::c_char;
}
extern "C" {
    #[doc = " Return a string specifying what the 'g' in gRPC stands for"]
    pub fn grpc_g_stands_for() -> *const ::std::os::raw::c_char;
}
extern "C" {
    #[doc = " Returns the completion queue factory based on the attributes. MAY return a\nNULL if no factory can be found"]
    pub fn grpc_completion_queue_factory_lookup(
        attributes: *const grpc_completion_queue_attributes,
    ) -> *const grpc_completion_queue_factory;
}
extern "C" {
    #[doc = " Helper function to create a completion queue with grpc_cq_completion_type\nof GRPC_CQ_NEXT and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING"]
    pub fn grpc_completion_queue_create_for_next(
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_completion_queue;
}
extern "C" {
    #[doc = " Helper function to create a completion queue with grpc_cq_completion_type\nof GRPC_CQ_PLUCK and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING"]
    pub fn grpc_completion_queue_create_for_pluck(
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_completion_queue;
}
extern "C" {
    #[doc = " Helper function to create a completion queue with grpc_cq_completion_type\nof GRPC_CQ_CALLBACK and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING.\nThis function is experimental."]
    pub fn grpc_completion_queue_create_for_callback(
        shutdown_callback: *mut grpc_completion_queue_functor,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_completion_queue;
}
extern "C" {
    #[doc = " Create a completion queue"]
    pub fn grpc_completion_queue_create(
        factory: *const grpc_completion_queue_factory,
        attributes: *const grpc_completion_queue_attributes,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_completion_queue;
}
extern "C" {
    #[doc = " Blocks until an event is available, the completion queue is being shut down,\nor deadline is reached.\n\nReturns a grpc_event with type GRPC_QUEUE_TIMEOUT on timeout,\notherwise a grpc_event describing the event that occurred.\n\nCallers must not call grpc_completion_queue_next and\ngrpc_completion_queue_pluck simultaneously on the same completion queue."]
    pub fn grpc_completion_queue_next(
        cq: *mut grpc_completion_queue,
        deadline: gpr_timespec,
        reserved: *mut ::std::os::raw::c_void,
    ) -> grpc_event;
}
extern "C" {
    #[doc = " Blocks until an event with tag 'tag' is available, the completion queue is\nbeing shutdown or deadline is reached.\n\nReturns a grpc_event with type GRPC_QUEUE_TIMEOUT on timeout,\notherwise a grpc_event describing the event that occurred.\n\nCallers must not call grpc_completion_queue_next and\ngrpc_completion_queue_pluck simultaneously on the same completion queue.\n\nCompletion queues support a maximum of GRPC_MAX_COMPLETION_QUEUE_PLUCKERS\nconcurrently executing plucks at any time."]
    pub fn grpc_completion_queue_pluck(
        cq: *mut grpc_completion_queue,
        tag: *mut ::std::os::raw::c_void,
        deadline: gpr_timespec,
        reserved: *mut ::std::os::raw::c_void,
    ) -> grpc_event;
}
extern "C" {
    #[doc = " Begin destruction of a completion queue. Once all possible events are\ndrained then grpc_completion_queue_next will start to produce\nGRPC_QUEUE_SHUTDOWN events only. At that point it's safe to call\ngrpc_completion_queue_destroy.\n\nAfter calling this function applications should ensure that no\nNEW work is added to be published on this completion queue."]
    pub fn grpc_completion_queue_shutdown(cq: *mut grpc_completion_queue);
}
extern "C" {
    #[doc = " Destroy a completion queue. The caller must ensure that the queue is\ndrained and no threads are executing grpc_completion_queue_next"]
    pub fn grpc_completion_queue_destroy(cq: *mut grpc_completion_queue);
}
extern "C" {
    #[doc = " EXPERIMENTAL API ************/\n/** Initializes a thread local cache for \\a cq.\n grpc_flush_cq_tls_cache() MUST be called on the same thread,\n with the same cq."]
    pub fn grpc_completion_queue_thread_local_cache_init(cq: *mut grpc_completion_queue);
}
extern "C" {
    #[doc = " EXPERIMENTAL API ************/\n/** Flushes the thread local cache for \\a cq.\n Returns 1 if there was contents in the cache.  If there was an event\n in \\a cq tls cache, its tag is placed in tag, and ok is set to the\n event success."]
    pub fn grpc_completion_queue_thread_local_cache_flush(
        cq: *mut grpc_completion_queue,
        tag: *mut *mut ::std::os::raw::c_void,
        ok: *mut ::std::os::raw::c_int,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Check the connectivity state of a channel."]
    pub fn grpc_channel_check_connectivity_state(
        channel: *mut grpc_channel,
        try_to_connect: ::std::os::raw::c_int,
    ) -> grpc_connectivity_state;
}
extern "C" {
    #[doc = " Number of active \"external connectivity state watchers\" attached to a\n channel.\n Useful for testing."]
    pub fn grpc_channel_num_external_connectivity_watchers(
        channel: *mut grpc_channel,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Watch for a change in connectivity state.\nOnce the channel connectivity state is different from last_observed_state,\ntag will be enqueued on cq with success=1.\nIf deadline expires BEFORE the state is changed, tag will be enqueued on cq\nwith success=0."]
    pub fn grpc_channel_watch_connectivity_state(
        channel: *mut grpc_channel,
        last_observed_state: grpc_connectivity_state,
        deadline: gpr_timespec,
        cq: *mut grpc_completion_queue,
        tag: *mut ::std::os::raw::c_void,
    );
}
extern "C" {
    #[doc = " Check whether a grpc channel supports connectivity watcher"]
    pub fn grpc_channel_support_connectivity_watcher(
        channel: *mut grpc_channel,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Create a call given a grpc_channel, in order to call 'method'. All\ncompletions are sent to 'completion_queue'. 'method' and 'host' need only\nlive through the invocation of this function.\nIf parent_call is non-NULL, it must be a server-side call. It will be used\nto propagate properties from the server call to this new client call,\ndepending on the value of \\a propagation_mask (see propagation_bits.h for\npossible values)."]
    pub fn grpc_channel_create_call(
        channel: *mut grpc_channel,
        parent_call: *mut grpc_call,
        propagation_mask: u32,
        completion_queue: *mut grpc_completion_queue,
        method: grpc_slice,
        host: *const grpc_slice,
        deadline: gpr_timespec,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_call;
}
extern "C" {
    #[doc = " Pre-register a method/host pair on a channel.\nmethod and host are not owned and must remain alive while the channel is\nalive."]
    pub fn grpc_channel_register_call(
        channel: *mut grpc_channel,
        method: *const ::std::os::raw::c_char,
        host: *const ::std::os::raw::c_char,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut ::std::os::raw::c_void;
}
extern "C" {
    #[doc = " Create a call given a handle returned from grpc_channel_register_call.\n\\sa grpc_channel_create_call."]
    pub fn grpc_channel_create_registered_call(
        channel: *mut grpc_channel,
        parent_call: *mut grpc_call,
        propagation_mask: u32,
        completion_queue: *mut grpc_completion_queue,
        registered_call_handle: *mut ::std::os::raw::c_void,
        deadline: gpr_timespec,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_call;
}
extern "C" {
    #[doc = " Allocate memory in the grpc_call arena: this memory is automatically\ndiscarded at call completion"]
    pub fn grpc_call_arena_alloc(call: *mut grpc_call, size: usize) -> *mut ::std::os::raw::c_void;
}
extern "C" {
    #[doc = " Start a batch of operations defined in the array ops; when complete, post a\ncompletion of type 'tag' to the completion queue bound to the call.\nThe order of ops specified in the batch has no significance.\nOnly one operation of each type can be active at once in any given\nbatch.\nIf a call to grpc_call_start_batch returns GRPC_CALL_OK you must call\ngrpc_completion_queue_next or grpc_completion_queue_pluck on the completion\nqueue associated with 'call' for work to be performed. If a call to\ngrpc_call_start_batch returns any value other than GRPC_CALL_OK it is\nguaranteed that no state associated with 'call' is changed and it is not\nappropriate to call grpc_completion_queue_next or\ngrpc_completion_queue_pluck consequent to the failed grpc_call_start_batch\ncall.\nIf a call to grpc_call_start_batch with an empty batch returns\nGRPC_CALL_OK, the tag is put in the completion queue immediately.\nTHREAD SAFETY: access to grpc_call_start_batch in multi-threaded environment\nneeds to be synchronized. As an optimization, you may synchronize batches\ncontaining just send operations independently from batches containing just\nreceive operations. Access to grpc_call_start_batch with an empty batch is\nthread-compatible."]
    pub fn grpc_call_start_batch(
        call: *mut grpc_call,
        ops: *const grpc_op,
        nops: usize,
        tag: *mut ::std::os::raw::c_void,
        reserved: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    #[doc = " Returns a newly allocated string representing the endpoint to which this\ncall is communicating with. The string is in the uri format accepted by\ngrpc_channel_create.\nThe returned string should be disposed of with gpr_free().\n\nWARNING: this value is never authenticated or subject to any security\nrelated code. It must not be used for any authentication related\nfunctionality. Instead, use grpc_auth_context."]
    pub fn grpc_call_get_peer(call: *mut grpc_call) -> *mut ::std::os::raw::c_char;
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct census_context {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " Set census context for a call; Must be called before first call to\ngrpc_call_start_batch()."]
    pub fn grpc_census_call_set_context(call: *mut grpc_call, context: *mut census_context);
}
extern "C" {
    #[doc = " Retrieve the calls current census context."]
    pub fn grpc_census_call_get_context(call: *mut grpc_call) -> *mut census_context;
}
extern "C" {
    #[doc = " Return a newly allocated string representing the target a channel was\ncreated for."]
    pub fn grpc_channel_get_target(channel: *mut grpc_channel) -> *mut ::std::os::raw::c_char;
}
extern "C" {
    #[doc = " Request info about the channel.\n\\a channel_info indicates what information is being requested and\nhow that information will be returned.\n\\a channel_info is owned by the caller."]
    pub fn grpc_channel_get_info(
        channel: *mut grpc_channel,
        channel_info: *const grpc_channel_info,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL.  Resets the channel's connect backoff.\nTODO(roth): When we see whether this proves useful, either promote\nto non-experimental or remove it."]
    pub fn grpc_channel_reset_connect_backoff(channel: *mut grpc_channel);
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_channel_credentials {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " Releases a channel credentials object.\nThe creator of the credentials object is responsible for its release."]
    pub fn grpc_channel_credentials_release(creds: *mut grpc_channel_credentials);
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_server_credentials {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " Releases a server_credentials object.\nThe creator of the server_credentials object is responsible for its release."]
    pub fn grpc_server_credentials_release(creds: *mut grpc_server_credentials);
}
extern "C" {
    #[doc = " Creates a secure channel using the passed-in credentials. Additional\nchannel level configuration MAY be provided by grpc_channel_args, though\nthe expectation is that most clients will want to simply pass NULL. The\nuser data in 'args' need only live through the invocation of this function.\nHowever, if any args of the 'pointer' type are passed, then the referenced\nvtable must be maintained by the caller until grpc_channel_destroy\nterminates. See grpc_channel_args definition for more on this."]
    pub fn grpc_channel_create(
        target: *const ::std::os::raw::c_char,
        creds: *mut grpc_channel_credentials,
        args: *const grpc_channel_args,
    ) -> *mut grpc_channel;
}
extern "C" {
    #[doc = " Create a lame client: this client fails every operation attempted on it."]
    pub fn grpc_lame_client_channel_create(
        target: *const ::std::os::raw::c_char,
        error_code: grpc_status_code::Type,
        error_message: *const ::std::os::raw::c_char,
    ) -> *mut grpc_channel;
}
extern "C" {
    #[doc = " Close and destroy a grpc channel"]
    pub fn grpc_channel_destroy(channel: *mut grpc_channel);
}
extern "C" {
    #[doc = " Cancel an RPC.\nCan be called multiple times, from any thread.\nTHREAD-SAFETY grpc_call_cancel and grpc_call_cancel_with_status\nare thread-safe, and can be called at any point before grpc_call_unref\nis called."]
    pub fn grpc_call_cancel(
        call: *mut grpc_call,
        reserved: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    #[doc = " Cancel an RPC.\nCan be called multiple times, from any thread.\nIf a status has not been received for the call, set it to the status code\nand description passed in.\nImportantly, this function does not send status nor description to the\nremote endpoint.\nNote that \\a description doesn't need be a static string.\nIt doesn't need to be alive after the call to\ngrpc_call_cancel_with_status completes."]
    pub fn grpc_call_cancel_with_status(
        call: *mut grpc_call,
        status: grpc_status_code::Type,
        description: *const ::std::os::raw::c_char,
        reserved: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpc_call_failed_before_recv_message(c: *const grpc_call) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Ref a call.\nTHREAD SAFETY: grpc_call_ref is thread-compatible"]
    pub fn grpc_call_ref(call: *mut grpc_call);
}
extern "C" {
    #[doc = " Unref a call.\nTHREAD SAFETY: grpc_call_unref is thread-compatible"]
    pub fn grpc_call_unref(call: *mut grpc_call);
}
extern "C" {
    #[doc = " Request notification of a new call.\nOnce a call is received, a notification tagged with \\a tag_new is added to\n\\a cq_for_notification. \\a call, \\a details and \\a request_metadata are\nupdated with the appropriate call information. \\a cq_bound_to_call is bound\nto \\a call, and batch operation notifications for that call will be posted\nto \\a cq_bound_to_call.\nNote that \\a cq_for_notification must have been registered to the server via\n\\a grpc_server_register_completion_queue."]
    pub fn grpc_server_request_call(
        server: *mut grpc_server,
        call: *mut *mut grpc_call,
        details: *mut grpc_call_details,
        request_metadata: *mut grpc_metadata_array,
        cq_bound_to_call: *mut grpc_completion_queue,
        cq_for_notification: *mut grpc_completion_queue,
        tag_new: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
#[repr(u32)]
#[doc = " How to handle payloads for a registered method"]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_server_register_method_payload_handling {
    #[doc = " Don't try to read the payload"]
    GRPC_SRM_PAYLOAD_NONE = 0,
    #[doc = " Read the initial payload as a byte buffer"]
    GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER = 1,
}
extern "C" {
    #[doc = " Registers a method in the server.\nMethods to this (host, method) pair will not be reported by\ngrpc_server_request_call, but instead be reported by\ngrpc_server_request_registered_call when passed the appropriate\nregistered_method (as returned by this function).\nMust be called before grpc_server_start.\nReturns NULL on failure."]
    pub fn grpc_server_register_method(
        server: *mut grpc_server,
        method: *const ::std::os::raw::c_char,
        host: *const ::std::os::raw::c_char,
        payload_handling: grpc_server_register_method_payload_handling,
        flags: u32,
    ) -> *mut ::std::os::raw::c_void;
}
extern "C" {
    #[doc = " Request notification of a new pre-registered call. 'cq_for_notification'\nmust have been registered to the server via\ngrpc_server_register_completion_queue."]
    pub fn grpc_server_request_registered_call(
        server: *mut grpc_server,
        registered_method: *mut ::std::os::raw::c_void,
        call: *mut *mut grpc_call,
        deadline: *mut gpr_timespec,
        request_metadata: *mut grpc_metadata_array,
        optional_payload: *mut *mut grpc_byte_buffer,
        cq_bound_to_call: *mut grpc_completion_queue,
        cq_for_notification: *mut grpc_completion_queue,
        tag_new: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    #[doc = " Create a server. Additional configuration for each incoming channel can\nbe specified with args. If no additional configuration is needed, args can\nbe NULL. The user data in 'args' need only live through the invocation of\nthis function. However, if any args of the 'pointer' type are passed, then\nthe referenced vtable must be maintained by the caller until\ngrpc_server_destroy terminates. See grpc_channel_args definition for more\non this."]
    pub fn grpc_server_create(
        args: *const grpc_channel_args,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_server;
}
extern "C" {
    #[doc = " Register a completion queue with the server. Must be done for any\nnotification completion queue that is passed to grpc_server_request_*_call\nand to grpc_server_shutdown_and_notify. Must be performed prior to\ngrpc_server_start."]
    pub fn grpc_server_register_completion_queue(
        server: *mut grpc_server,
        cq: *mut grpc_completion_queue,
        reserved: *mut ::std::os::raw::c_void,
    );
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_serving_status_update {
    pub code: grpc_status_code::Type,
    pub error_message: *const ::std::os::raw::c_char,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_server_xds_status_notifier {
    pub on_serving_status_update: ::std::option::Option<
        unsafe extern "C" fn(
            user_data: *mut ::std::os::raw::c_void,
            uri: *const ::std::os::raw::c_char,
            update: grpc_serving_status_update,
        ),
    >,
    pub user_data: *mut ::std::os::raw::c_void,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_server_config_fetcher {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " EXPERIMENTAL.  Creates an xDS config fetcher."]
    pub fn grpc_server_config_fetcher_xds_create(
        notifier: grpc_server_xds_status_notifier,
        args: *const grpc_channel_args,
    ) -> *mut grpc_server_config_fetcher;
}
extern "C" {
    #[doc = " EXPERIMENTAL.  Destroys a config fetcher."]
    pub fn grpc_server_config_fetcher_destroy(config_fetcher: *mut grpc_server_config_fetcher);
}
extern "C" {
    #[doc = " EXPERIMENTAL.  Sets the server's config fetcher.  Takes ownership.\nMust be called before adding ports"]
    pub fn grpc_server_set_config_fetcher(
        server: *mut grpc_server,
        config_fetcher: *mut grpc_server_config_fetcher,
    );
}
extern "C" {
    #[doc = " Add a HTTP2 over an encrypted link over tcp listener.\nReturns bound port number on success, 0 on failure.\nREQUIRES: server not started"]
    pub fn grpc_server_add_http2_port(
        server: *mut grpc_server,
        addr: *const ::std::os::raw::c_char,
        creds: *mut grpc_server_credentials,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Start a server - tells all listeners to start listening"]
    pub fn grpc_server_start(server: *mut grpc_server);
}
extern "C" {
    #[doc = " Begin shutting down a server.\nAfter completion, no new calls or connections will be admitted.\nExisting calls will be allowed to complete.\nSend a GRPC_OP_COMPLETE event when there are no more calls being serviced.\nShutdown is idempotent, and all tags will be notified at once if multiple\ngrpc_server_shutdown_and_notify calls are made. 'cq' must have been\nregistered to this server via grpc_server_register_completion_queue."]
    pub fn grpc_server_shutdown_and_notify(
        server: *mut grpc_server,
        cq: *mut grpc_completion_queue,
        tag: *mut ::std::os::raw::c_void,
    );
}
extern "C" {
    #[doc = " Cancel all in-progress calls.\nOnly usable after shutdown."]
    pub fn grpc_server_cancel_all_calls(server: *mut grpc_server);
}
extern "C" {
    #[doc = " Destroy a server.\nShutdown must have completed beforehand (i.e. all tags generated by\ngrpc_server_shutdown_and_notify must have been received, and at least\none call to grpc_server_shutdown_and_notify must have been made)."]
    pub fn grpc_server_destroy(server: *mut grpc_server);
}
extern "C" {
    #[doc = " Enable or disable a tracer.\n\nTracers (usually controlled by the environment variable GRPC_TRACE)\nallow printf-style debugging on GRPC internals, and are useful for\ntracking down problems in the field.\n\nUse of this function is not strictly thread-safe, but the\nthread-safety issues raised by it should not be of concern."]
    pub fn grpc_tracer_set_enabled(
        name: *const ::std::os::raw::c_char,
        enabled: ::std::os::raw::c_int,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Check whether a metadata key is legal (will be accepted by core)"]
    pub fn grpc_header_key_is_legal(slice: grpc_slice) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Check whether a non-binary metadata value is legal (will be accepted by\ncore)"]
    pub fn grpc_header_nonbin_value_is_legal(slice: grpc_slice) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Check whether a metadata key corresponds to a binary value"]
    pub fn grpc_is_binary_header(slice: grpc_slice) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Convert grpc_call_error values to a string"]
    pub fn grpc_call_error_to_string(error: grpc_call_error) -> *const ::std::os::raw::c_char;
}
extern "C" {
    #[doc = " Create a buffer pool"]
    pub fn grpc_resource_quota_create(
        trace_name: *const ::std::os::raw::c_char,
    ) -> *mut grpc_resource_quota;
}
extern "C" {
    #[doc = " Add a reference to a buffer pool"]
    pub fn grpc_resource_quota_ref(resource_quota: *mut grpc_resource_quota);
}
extern "C" {
    #[doc = " Drop a reference to a buffer pool"]
    pub fn grpc_resource_quota_unref(resource_quota: *mut grpc_resource_quota);
}
extern "C" {
    #[doc = " Update the size of a buffer pool"]
    pub fn grpc_resource_quota_resize(resource_quota: *mut grpc_resource_quota, new_size: usize);
}
extern "C" {
    #[doc = " Update the size of the maximum number of threads allowed"]
    pub fn grpc_resource_quota_set_max_threads(
        resource_quota: *mut grpc_resource_quota,
        new_max_threads: ::std::os::raw::c_int,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL.  Dumps xDS configs as a serialized ClientConfig proto.\nThe full name of the proto is envoy.service.status.v3.ClientConfig."]
    pub fn grpc_dump_xds_configs() -> grpc_slice;
}
extern "C" {
    #[doc = " Fetch a vtable for a grpc_channel_arg that points to a grpc_resource_quota"]
    pub fn grpc_resource_quota_arg_vtable() -> *const grpc_arg_pointer_vtable;
}
extern "C" {
    #[doc = " CHANNELZ API *************/\n/** Channelz is under active development. The following APIs will see some\nchurn as the feature is implemented. This comment will be removed once\nchannelz is officially supported, and these APIs become stable. For now\nyou may track the progress by following this github issue:\nhttps://github.com/grpc/grpc/issues/15340\n\nthe following APIs return allocated JSON strings that match the response\nobjects from the channelz proto, found here:\nhttps://github.com/grpc/grpc/blob/master/src/proto/grpc/channelz/channelz.proto.\n\nFor easy conversion to protobuf, The JSON is formatted according to:\nhttps://developers.google.com/protocol-buffers/docs/proto3#json."]
    pub fn grpc_channelz_get_top_channels(start_channel_id: isize) -> *mut ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpc_channelz_get_servers(start_server_id: isize) -> *mut ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpc_channelz_get_server(server_id: isize) -> *mut ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpc_channelz_get_server_sockets(
        server_id: isize,
        start_socket_id: isize,
        max_results: isize,
    ) -> *mut ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpc_channelz_get_channel(channel_id: isize) -> *mut ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpc_channelz_get_subchannel(subchannel_id: isize) -> *mut ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpc_channelz_get_socket(socket_id: isize) -> *mut ::std::os::raw::c_char;
}
extern "C" {
    #[doc = " EXPERIMENTAL - Subject to change.\n Fetch a vtable for grpc_channel_arg that points to\n grpc_authorization_policy_provider."]
    pub fn grpc_authorization_policy_provider_arg_vtable() -> *const grpc_arg_pointer_vtable;
}
extern "C" {
    pub fn grpc_cronet_secure_channel_create(
        engine: *mut ::std::os::raw::c_void,
        target: *const ::std::os::raw::c_char,
        args: *const grpc_channel_args,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_channel;
}
extern "C" {
    #[doc = " Create a secure channel to 'target' using file descriptor 'fd' and passed-in\ncredentials. The 'target' argument will be used to indicate the name for\nthis channel. Note that this API currently only supports insecure channel\ncredentials. Using other types of credentials will result in a failure."]
    pub fn grpc_channel_create_from_fd(
        target: *const ::std::os::raw::c_char,
        fd: ::std::os::raw::c_int,
        creds: *mut grpc_channel_credentials,
        args: *const grpc_channel_args,
    ) -> *mut grpc_channel;
}
extern "C" {
    #[doc = " Add the connected secure communication channel based on file descriptor 'fd'\nto the 'server' and server credentials 'creds'. The 'fd' must be an open file\ndescriptor corresponding to a connected socket. Events from the file\ndescriptor may come on any of the server completion queues (i.e completion\nqueues registered via the grpc_server_register_completion_queue API).\nNote that this API currently only supports inseure server credentials\nUsing other types of credentials will result in a failure.\nTODO(hork): add channel_args to this API to allow endpoints and transports\ncreated in this function to participate in the resource quota feature."]
    pub fn grpc_server_add_channel_from_fd(
        server: *mut grpc_server,
        fd: ::std::os::raw::c_int,
        creds: *mut grpc_server_credentials,
    );
}
#[repr(u32)]
#[doc = " Results for the SSL roots override callback."]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_ssl_roots_override_result {
    GRPC_SSL_ROOTS_OVERRIDE_OK = 0,
    GRPC_SSL_ROOTS_OVERRIDE_FAIL_PERMANENTLY = 1,
    #[doc = " Do not try fallback options."]
    GRPC_SSL_ROOTS_OVERRIDE_FAIL = 2,
}
#[repr(u32)]
#[doc = " Callback results for dynamically loading a SSL certificate config."]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_ssl_certificate_config_reload_status {
    GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED = 0,
    GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW = 1,
    GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL = 2,
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_ssl_client_certificate_request_type {
    #[doc = " Server does not request client certificate.\nThe certificate presented by the client is not checked by the server at\nall. (A client may present a self signed or signed certificate or not\npresent a certificate at all and any of those option would be accepted)"]
    GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE = 0,
    #[doc = " Server requests client certificate but does not enforce that the client\npresents a certificate.\n\nIf the client presents a certificate, the client authentication is left to\nthe application (the necessary metadata will be available to the\napplication via authentication context properties, see grpc_auth_context).\n\nThe client's key certificate pair must be valid for the SSL connection to\nbe established."]
    GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_BUT_DONT_VERIFY = 1,
    #[doc = " Server requests client certificate but does not enforce that the client\npresents a certificate.\n\nIf the client presents a certificate, the client authentication is done by\nthe gRPC framework. (For a successful connection the client needs to either\npresent a certificate that can be verified against the root certificate\nconfigured by the server or not present a certificate at all)\n\nThe client's key certificate pair must be valid for the SSL connection to\nbe established."]
    GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY = 2,
    #[doc = " Server requests client certificate and enforces that the client presents a\ncertificate.\n\nIf the client presents a certificate, the client authentication is left to\nthe application (the necessary metadata will be available to the\napplication via authentication context properties, see grpc_auth_context).\n\nThe client's key certificate pair must be valid for the SSL connection to\nbe established."]
    GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_BUT_DONT_VERIFY = 3,
    #[doc = " Server requests client certificate and enforces that the client presents a\ncertificate.\n\nThe certificate presented by the client is verified by the gRPC framework.\n(For a successful connection the client needs to present a certificate that\ncan be verified against the root certificate configured by the server)\n\nThe client's key certificate pair must be valid for the SSL connection to\nbe established."]
    GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY = 4,
}
impl grpc_security_level {
    pub const GRPC_SECURITY_NONE: grpc_security_level = grpc_security_level::GRPC_SECURITY_MIN;
}
impl grpc_security_level {
    pub const GRPC_SECURITY_MAX: grpc_security_level =
        grpc_security_level::GRPC_PRIVACY_AND_INTEGRITY;
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_security_level {
    GRPC_SECURITY_MIN = 0,
    GRPC_INTEGRITY_ONLY = 1,
    GRPC_PRIVACY_AND_INTEGRITY = 2,
}
#[repr(u32)]
#[doc = " Type of local connections for which local channel/server credentials will be\n applied. It supports UDS and local TCP connections."]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_local_connect_type {
    UDS = 0,
    LOCAL_TCP = 1,
}
#[repr(u32)]
#[doc = " The TLS versions that are supported by the SSL stack."]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum grpc_tls_version {
    TLS1_2 = 0,
    TLS1_3 = 1,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_auth_context {
    _unused: [u8; 0],
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_auth_property_iterator {
    pub ctx: *const grpc_auth_context,
    pub index: usize,
    pub name: *const ::std::os::raw::c_char,
}
#[doc = " value, if not NULL, is guaranteed to be NULL terminated."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_auth_property {
    pub name: *mut ::std::os::raw::c_char,
    pub value: *mut ::std::os::raw::c_char,
    pub value_length: usize,
}
extern "C" {
    #[doc = " Returns NULL when the iterator is at the end."]
    pub fn grpc_auth_property_iterator_next(
        it: *mut grpc_auth_property_iterator,
    ) -> *const grpc_auth_property;
}
extern "C" {
    #[doc = " Iterates over the auth context."]
    pub fn grpc_auth_context_property_iterator(
        ctx: *const grpc_auth_context,
    ) -> grpc_auth_property_iterator;
}
extern "C" {
    #[doc = " Gets the peer identity. Returns an empty iterator (first _next will return\nNULL) if the peer is not authenticated."]
    pub fn grpc_auth_context_peer_identity(
        ctx: *const grpc_auth_context,
    ) -> grpc_auth_property_iterator;
}
extern "C" {
    #[doc = " Finds a property in the context. May return an empty iterator (first _next\nwill return NULL) if no property with this name was found in the context."]
    pub fn grpc_auth_context_find_properties_by_name(
        ctx: *const grpc_auth_context,
        name: *const ::std::os::raw::c_char,
    ) -> grpc_auth_property_iterator;
}
extern "C" {
    #[doc = " Gets the name of the property that indicates the peer identity. Will return\nNULL if the peer is not authenticated."]
    pub fn grpc_auth_context_peer_identity_property_name(
        ctx: *const grpc_auth_context,
    ) -> *const ::std::os::raw::c_char;
}
extern "C" {
    #[doc = " Returns 1 if the peer is authenticated, 0 otherwise."]
    pub fn grpc_auth_context_peer_is_authenticated(
        ctx: *const grpc_auth_context,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " Gets the auth context from the call. Caller needs to call\ngrpc_auth_context_release on the returned context."]
    pub fn grpc_call_auth_context(call: *mut grpc_call) -> *mut grpc_auth_context;
}
extern "C" {
    #[doc = " Releases the auth context returned from grpc_call_auth_context."]
    pub fn grpc_auth_context_release(context: *mut grpc_auth_context);
}
extern "C" {
    #[doc = " Add a property."]
    pub fn grpc_auth_context_add_property(
        ctx: *mut grpc_auth_context,
        name: *const ::std::os::raw::c_char,
        value: *const ::std::os::raw::c_char,
        value_length: usize,
    );
}
extern "C" {
    #[doc = " Add a C string property."]
    pub fn grpc_auth_context_add_cstring_property(
        ctx: *mut grpc_auth_context,
        name: *const ::std::os::raw::c_char,
        value: *const ::std::os::raw::c_char,
    );
}
extern "C" {
    #[doc = " Sets the property name. Returns 1 if successful or 0 in case of failure\n(which means that no property with this name exists)."]
    pub fn grpc_auth_context_set_peer_identity_property_name(
        ctx: *mut grpc_auth_context,
        name: *const ::std::os::raw::c_char,
    ) -> ::std::os::raw::c_int;
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_ssl_session_cache {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " Create LRU cache for client-side SSL sessions with the given capacity.\nIf capacity is < 1, a default capacity is used instead."]
    pub fn grpc_ssl_session_cache_create_lru(capacity: usize) -> *mut grpc_ssl_session_cache;
}
extern "C" {
    #[doc = " Destroy SSL session cache."]
    pub fn grpc_ssl_session_cache_destroy(cache: *mut grpc_ssl_session_cache);
}
extern "C" {
    #[doc = " Create a channel arg with the given cache object."]
    pub fn grpc_ssl_session_cache_create_channel_arg(
        cache: *mut grpc_ssl_session_cache,
    ) -> grpc_arg;
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_call_credentials {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " Releases a call credentials object.\nThe creator of the credentials object is responsible for its release."]
    pub fn grpc_call_credentials_release(creds: *mut grpc_call_credentials);
}
extern "C" {
    #[doc = " Creates default credentials to connect to a google gRPC service.\nWARNING: Do NOT use this credentials to connect to a non-google service as\nthis could result in an oauth2 token leak. The security level of the\nresulting connection is GRPC_PRIVACY_AND_INTEGRITY.\n\nIf specified, the supplied call credentials object will be attached to the\nreturned channel credentials object. The call_credentials object must remain\nvalid throughout the lifetime of the returned grpc_channel_credentials\nobject. It is expected that the call credentials object was generated\naccording to the Application Default Credentials mechanism and asserts the\nidentity of the default service account of the machine. Supplying any other\nsort of call credential will result in undefined behavior, up to and\nincluding the sudden and unexpected failure of RPCs.\n\nIf nullptr is supplied, the returned channel credentials object will use a\ncall credentials object based on the Application Default Credentials\nmechanism."]
    pub fn grpc_google_default_credentials_create(
        call_credentials: *mut grpc_call_credentials,
    ) -> *mut grpc_channel_credentials;
}
#[doc = " Callback for getting the SSL roots override from the application.\nIn case of success, *pem_roots_certs must be set to a NULL terminated string\ncontaining the list of PEM encoded root certificates. The ownership is passed\nto the core and freed (laster by the core) with gpr_free.\nIf this function fails and GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is\nset to a valid path, it will override the roots specified this func"]
pub type grpc_ssl_roots_override_callback = ::std::option::Option<
    unsafe extern "C" fn(
        pem_root_certs: *mut *mut ::std::os::raw::c_char,
    ) -> grpc_ssl_roots_override_result,
>;
extern "C" {
    #[doc = " Setup a callback to override the default TLS/SSL roots.\nThis function is not thread-safe and must be called at initialization time\nbefore any ssl credentials are created to have the desired side effect.\nIf GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is set to a valid path, the\ncallback will not be called."]
    pub fn grpc_set_ssl_roots_override_callback(cb: grpc_ssl_roots_override_callback);
}
#[doc = " Object that holds a private key / certificate chain pair in PEM format."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_ssl_pem_key_cert_pair {
    #[doc = " private_key is the NULL-terminated string containing the PEM encoding of\nthe client's private key."]
    pub private_key: *const ::std::os::raw::c_char,
    #[doc = " cert_chain is the NULL-terminated string containing the PEM encoding of\nthe client's certificate chain."]
    pub cert_chain: *const ::std::os::raw::c_char,
}
#[doc = " Deprecated in favor of grpc_ssl_verify_peer_options. It will be removed\nafter all of its call sites are migrated to grpc_ssl_verify_peer_options.\nObject that holds additional peer-verification options on a secure\nchannel."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct verify_peer_options {
    #[doc = " If non-NULL this callback will be invoked with the expected\ntarget_name, the peer's certificate (in PEM format), and whatever\nuserdata pointer is set below. If a non-zero value is returned by this\ncallback then it is treated as a verification failure. Invocation of\nthe callback is blocking, so any implementation should be light-weight."]
    pub verify_peer_callback: ::std::option::Option<
        unsafe extern "C" fn(
            target_name: *const ::std::os::raw::c_char,
            peer_pem: *const ::std::os::raw::c_char,
            userdata: *mut ::std::os::raw::c_void,
        ) -> ::std::os::raw::c_int,
    >,
    #[doc = " Arbitrary userdata that will be passed as the last argument to\nverify_peer_callback."]
    pub verify_peer_callback_userdata: *mut ::std::os::raw::c_void,
    #[doc = " A destruct callback that will be invoked when the channel is being\ncleaned up. The userdata argument will be passed to it. The intent is\nto perform any cleanup associated with that userdata."]
    pub verify_peer_destruct:
        ::std::option::Option<unsafe extern "C" fn(userdata: *mut ::std::os::raw::c_void)>,
}
#[doc = " Object that holds additional peer-verification options on a secure\nchannel."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_ssl_verify_peer_options {
    #[doc = " If non-NULL this callback will be invoked with the expected\ntarget_name, the peer's certificate (in PEM format), and whatever\nuserdata pointer is set below. If a non-zero value is returned by this\ncallback then it is treated as a verification failure. Invocation of\nthe callback is blocking, so any implementation should be light-weight."]
    pub verify_peer_callback: ::std::option::Option<
        unsafe extern "C" fn(
            target_name: *const ::std::os::raw::c_char,
            peer_pem: *const ::std::os::raw::c_char,
            userdata: *mut ::std::os::raw::c_void,
        ) -> ::std::os::raw::c_int,
    >,
    #[doc = " Arbitrary userdata that will be passed as the last argument to\nverify_peer_callback."]
    pub verify_peer_callback_userdata: *mut ::std::os::raw::c_void,
    #[doc = " A destruct callback that will be invoked when the channel is being\ncleaned up. The userdata argument will be passed to it. The intent is\nto perform any cleanup associated with that userdata."]
    pub verify_peer_destruct:
        ::std::option::Option<unsafe extern "C" fn(userdata: *mut ::std::os::raw::c_void)>,
}
extern "C" {
    #[doc = " Deprecated in favor of grpc_ssl_server_credentials_create_ex. It will be\nremoved after all of its call sites are migrated to\ngrpc_ssl_server_credentials_create_ex. Creates an SSL credentials object.\nThe security level of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY.\n- pem_root_certs is the NULL-terminated string containing the PEM encoding\nof the server root certificates. If this parameter is NULL, the\nimplementation will first try to dereference the file pointed by the\nGRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable, and if that fails,\ntry to get the roots set by grpc_override_ssl_default_roots. Eventually,\nif all these fail, it will try to get the roots from a well-known place on\ndisk (in the grpc install directory).\n\ngRPC has implemented root cache if the underlying OpenSSL library supports\nit. The gRPC root certificates cache is only applicable on the default\nroot certificates, which is used when this parameter is nullptr. If user\nprovides their own pem_root_certs, when creating an SSL credential object,\ngRPC would not be able to cache it, and each subchannel will generate a\ncopy of the root store. So it is recommended to avoid providing large room\npem with pem_root_certs parameter to avoid excessive memory consumption,\nparticularly on mobile platforms such as iOS.\n- pem_key_cert_pair is a pointer on the object containing client's private\nkey and certificate chain. This parameter can be NULL if the client does\nnot have such a key/cert pair.\n- verify_options is an optional verify_peer_options object which holds\nadditional options controlling how peer certificates are verified. For\nexample, you can supply a callback which receives the peer's certificate\nwith which you can do additional verification. Can be NULL, in which\ncase verification will retain default behavior. Any settings in\nverify_options are copied during this call, so the verify_options\nobject can be released afterwards."]
    pub fn grpc_ssl_credentials_create(
        pem_root_certs: *const ::std::os::raw::c_char,
        pem_key_cert_pair: *mut grpc_ssl_pem_key_cert_pair,
        verify_options: *const verify_peer_options,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_channel_credentials;
}
extern "C" {
    pub fn grpc_ssl_credentials_create_ex(
        pem_root_certs: *const ::std::os::raw::c_char,
        pem_key_cert_pair: *mut grpc_ssl_pem_key_cert_pair,
        verify_options: *const grpc_ssl_verify_peer_options,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_channel_credentials;
}
extern "C" {
    #[doc = " Creates a composite channel credentials object. The security level of\n resulting connection is determined by channel_creds."]
    pub fn grpc_composite_channel_credentials_create(
        channel_creds: *mut grpc_channel_credentials,
        call_creds: *mut grpc_call_credentials,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_channel_credentials;
}
extern "C" {
    #[doc = " Creates a composite call credentials object."]
    pub fn grpc_composite_call_credentials_create(
        creds1: *mut grpc_call_credentials,
        creds2: *mut grpc_call_credentials,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_call_credentials;
}
extern "C" {
    #[doc = " Creates a compute engine credentials object for connecting to Google.\nWARNING: Do NOT use this credentials to connect to a non-google service as\nthis could result in an oauth2 token leak."]
    pub fn grpc_google_compute_engine_credentials_create(
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_call_credentials;
}
extern "C" {
    pub fn grpc_max_auth_token_lifetime() -> gpr_timespec;
}
extern "C" {
    #[doc = " Creates a JWT credentials object. May return NULL if the input is invalid.\n- json_key is the JSON key string containing the client's private key.\n- token_lifetime is the lifetime of each Json Web Token (JWT) created with\nthis credentials.  It should not exceed grpc_max_auth_token_lifetime or\nwill be cropped to this value."]
    pub fn grpc_service_account_jwt_access_credentials_create(
        json_key: *const ::std::os::raw::c_char,
        token_lifetime: gpr_timespec,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_call_credentials;
}
extern "C" {
    #[doc = " Builds External Account credentials.\n- json_string is the JSON string containing the credentials options.\n- scopes_string contains the scopes to be binded with the credentials.\nThis API is used for experimental purposes for now and may change in the\nfuture."]
    pub fn grpc_external_account_credentials_create(
        json_string: *const ::std::os::raw::c_char,
        scopes_string: *const ::std::os::raw::c_char,
    ) -> *mut grpc_call_credentials;
}
extern "C" {
    #[doc = " Creates an Oauth2 Refresh Token credentials object for connecting to Google.\nMay return NULL if the input is invalid.\nWARNING: Do NOT use this credentials to connect to a non-google service as\nthis could result in an oauth2 token leak.\n- json_refresh_token is the JSON string containing the refresh token itself\nalong with a client_id and client_secret."]
    pub fn grpc_google_refresh_token_credentials_create(
        json_refresh_token: *const ::std::os::raw::c_char,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_call_credentials;
}
extern "C" {
    #[doc = " Creates an Oauth2 Access Token credentials with an access token that was\nacquired by an out of band mechanism."]
    pub fn grpc_access_token_credentials_create(
        access_token: *const ::std::os::raw::c_char,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_call_credentials;
}
extern "C" {
    #[doc = " Creates an IAM credentials object for connecting to Google."]
    pub fn grpc_google_iam_credentials_create(
        authorization_token: *const ::std::os::raw::c_char,
        authority_selector: *const ::std::os::raw::c_char,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_call_credentials;
}
#[doc = " Options for creating STS Oauth Token Exchange credentials following the IETF\ndraft https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-16.\nOptional fields may be set to NULL or empty string. It is the responsibility\nof the caller to ensure that the subject and actor tokens are refreshed on\ndisk at the specified paths. This API is used for experimental purposes for\nnow and may change in the future."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_sts_credentials_options {
    pub token_exchange_service_uri: *const ::std::os::raw::c_char,
    pub resource: *const ::std::os::raw::c_char,
    pub audience: *const ::std::os::raw::c_char,
    pub scope: *const ::std::os::raw::c_char,
    pub requested_token_type: *const ::std::os::raw::c_char,
    pub subject_token_path: *const ::std::os::raw::c_char,
    pub subject_token_type: *const ::std::os::raw::c_char,
    pub actor_token_path: *const ::std::os::raw::c_char,
    pub actor_token_type: *const ::std::os::raw::c_char,
}
extern "C" {
    #[doc = " Creates an STS credentials following the STS Token Exchanged specifed in the\nIETF draft https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-16.\nThis API is used for experimental purposes for now and may change in the\nfuture."]
    pub fn grpc_sts_credentials_create(
        options: *const grpc_sts_credentials_options,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_call_credentials;
}
#[doc = " Callback function to be called by the metadata credentials plugin\nimplementation when the metadata is ready.\n- user_data is the opaque pointer that was passed in the get_metadata method\nof the grpc_metadata_credentials_plugin (see below).\n- creds_md is an array of credentials metadata produced by the plugin. It\nmay be set to NULL in case of an error.\n- num_creds_md is the number of items in the creds_md array.\n- status must be GRPC_STATUS_OK in case of success or another specific error\ncode otherwise.\n- error_details contains details about the error if any. In case of success\nit should be NULL and will be otherwise ignored."]
pub type grpc_credentials_plugin_metadata_cb = ::std::option::Option<
    unsafe extern "C" fn(
        user_data: *mut ::std::os::raw::c_void,
        creds_md: *const grpc_metadata,
        num_creds_md: usize,
        status: grpc_status_code::Type,
        error_details: *const ::std::os::raw::c_char,
    ),
>;
#[doc = " Context that can be used by metadata credentials plugin in order to create\nauth related metadata."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_auth_metadata_context {
    #[doc = " The fully qualifed service url."]
    pub service_url: *const ::std::os::raw::c_char,
    #[doc = " The method name of the RPC being called (not fully qualified).\nThe fully qualified method name can be built from the service_url:\nfull_qualified_method_name = ctx->service_url + '/' + ctx->method_name."]
    pub method_name: *const ::std::os::raw::c_char,
    #[doc = " The auth_context of the channel which gives the server's identity."]
    pub channel_auth_context: *const grpc_auth_context,
    #[doc = " Reserved for future use."]
    pub reserved: *mut ::std::os::raw::c_void,
}
extern "C" {
    #[doc = " Performs a deep copy from \\a from to \\a to."]
    pub fn grpc_auth_metadata_context_copy(
        from: *mut grpc_auth_metadata_context,
        to: *mut grpc_auth_metadata_context,
    );
}
extern "C" {
    #[doc = " Releases internal resources held by \\a context."]
    pub fn grpc_auth_metadata_context_reset(context: *mut grpc_auth_metadata_context);
}
#[doc = " grpc_metadata_credentials plugin is an API user provided structure used to\ncreate grpc_credentials objects that can be set on a channel (composed) or\na call. See grpc_credentials_metadata_create_from_plugin below.\nThe grpc client stack will call the get_metadata method of the plugin for\nevery call in scope for the credentials created from it."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_metadata_credentials_plugin {
    #[doc = " The implementation of this method has to be non-blocking, but can\nbe performed synchronously or asynchronously.\n\nIf processing occurs synchronously, returns non-zero and populates\ncreds_md, num_creds_md, status, and error_details.  In this case,\nthe caller takes ownership of the entries in creds_md and of\nerror_details.  Note that if the plugin needs to return more than\nGRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX entries in creds_md, it must\nreturn asynchronously.\n\nIf processing occurs asynchronously, returns zero and invokes \\a cb\nwhen processing is completed.  \\a user_data will be passed as the\nfirst parameter of the callback.  NOTE: \\a cb MUST be invoked in a\ndifferent thread, not from the thread in which \\a get_metadata() is\ninvoked.\n\n\\a context is the information that can be used by the plugin to create\nauth metadata."]
    pub get_metadata: ::std::option::Option<
        unsafe extern "C" fn(
            state: *mut ::std::os::raw::c_void,
            context: grpc_auth_metadata_context,
            cb: grpc_credentials_plugin_metadata_cb,
            user_data: *mut ::std::os::raw::c_void,
            creds_md: *mut grpc_metadata,
            num_creds_md: *mut usize,
            status: *mut grpc_status_code::Type,
            error_details: *mut *const ::std::os::raw::c_char,
        ) -> ::std::os::raw::c_int,
    >,
    #[doc = " Implements debug string of the given plugin. This method returns an\n allocated string that the caller needs to free using gpr_free()"]
    pub debug_string: ::std::option::Option<
        unsafe extern "C" fn(state: *mut ::std::os::raw::c_void) -> *mut ::std::os::raw::c_char,
    >,
    #[doc = " Destroys the plugin state."]
    pub destroy: ::std::option::Option<unsafe extern "C" fn(state: *mut ::std::os::raw::c_void)>,
    #[doc = " State that will be set as the first parameter of the methods above."]
    pub state: *mut ::std::os::raw::c_void,
    #[doc = " Type of credentials that this plugin is implementing."]
    pub type_: *const ::std::os::raw::c_char,
}
extern "C" {
    #[doc = " Creates a credentials object from a plugin with a specified minimum security\n level."]
    pub fn grpc_metadata_credentials_create_from_plugin(
        plugin: grpc_metadata_credentials_plugin,
        min_security_level: grpc_security_level,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_call_credentials;
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_ssl_server_certificate_config {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " Creates a grpc_ssl_server_certificate_config object.\n- pem_roots_cert is the NULL-terminated string containing the PEM encoding of\nthe client root certificates. This parameter may be NULL if the server does\nnot want the client to be authenticated with SSL.\n- pem_key_cert_pairs is an array private key / certificate chains of the\nserver. This parameter cannot be NULL.\n- num_key_cert_pairs indicates the number of items in the private_key_files\nand cert_chain_files parameters. It must be at least 1.\n- It is the caller's responsibility to free this object via\ngrpc_ssl_server_certificate_config_destroy()."]
    pub fn grpc_ssl_server_certificate_config_create(
        pem_root_certs: *const ::std::os::raw::c_char,
        pem_key_cert_pairs: *const grpc_ssl_pem_key_cert_pair,
        num_key_cert_pairs: usize,
    ) -> *mut grpc_ssl_server_certificate_config;
}
extern "C" {
    #[doc = " Destroys a grpc_ssl_server_certificate_config object."]
    pub fn grpc_ssl_server_certificate_config_destroy(
        config: *mut grpc_ssl_server_certificate_config,
    );
}
#[doc = " Callback to retrieve updated SSL server certificates, private keys, and\ntrusted CAs (for client authentication).\n- user_data parameter, if not NULL, contains opaque data to be used by the\ncallback.\n- Use grpc_ssl_server_certificate_config_create to create the config.\n- The caller assumes ownership of the config."]
pub type grpc_ssl_server_certificate_config_callback = ::std::option::Option<
    unsafe extern "C" fn(
        user_data: *mut ::std::os::raw::c_void,
        config: *mut *mut grpc_ssl_server_certificate_config,
    ) -> grpc_ssl_certificate_config_reload_status,
>;
extern "C" {
    #[doc = " Deprecated in favor of grpc_ssl_server_credentials_create_ex.\nCreates an SSL server_credentials object.\n- pem_roots_cert is the NULL-terminated string containing the PEM encoding of\nthe client root certificates. This parameter may be NULL if the server does\nnot want the client to be authenticated with SSL.\n- pem_key_cert_pairs is an array private key / certificate chains of the\nserver. This parameter cannot be NULL.\n- num_key_cert_pairs indicates the number of items in the private_key_files\nand cert_chain_files parameters. It should be at least 1.\n- force_client_auth, if set to non-zero will force the client to authenticate\nwith an SSL cert. Note that this option is ignored if pem_root_certs is\nNULL."]
    pub fn grpc_ssl_server_credentials_create(
        pem_root_certs: *const ::std::os::raw::c_char,
        pem_key_cert_pairs: *mut grpc_ssl_pem_key_cert_pair,
        num_key_cert_pairs: usize,
        force_client_auth: ::std::os::raw::c_int,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_server_credentials;
}
extern "C" {
    #[doc = " Deprecated in favor of grpc_ssl_server_credentials_create_with_options.\nSame as grpc_ssl_server_credentials_create method except uses\ngrpc_ssl_client_certificate_request_type enum to support more ways to\nauthenticate client certificates."]
    pub fn grpc_ssl_server_credentials_create_ex(
        pem_root_certs: *const ::std::os::raw::c_char,
        pem_key_cert_pairs: *mut grpc_ssl_pem_key_cert_pair,
        num_key_cert_pairs: usize,
        client_certificate_request: grpc_ssl_client_certificate_request_type,
        reserved: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_server_credentials;
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_ssl_server_credentials_options {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " Creates an options object using a certificate config. Use this method when\nthe certificates and keys of the SSL server will not change during the\nserver's lifetime.\n- Takes ownership of the certificate_config parameter."]
    pub fn grpc_ssl_server_credentials_create_options_using_config(
        client_certificate_request: grpc_ssl_client_certificate_request_type,
        certificate_config: *mut grpc_ssl_server_certificate_config,
    ) -> *mut grpc_ssl_server_credentials_options;
}
extern "C" {
    #[doc = " Creates an options object using a certificate config fetcher. Use this\nmethod to reload the certificates and keys of the SSL server without\ninterrupting the operation of the server. Initial certificate config will be\nfetched during server initialization.\n- user_data parameter, if not NULL, contains opaque data which will be passed\nto the fetcher (see definition of\ngrpc_ssl_server_certificate_config_callback)."]
    pub fn grpc_ssl_server_credentials_create_options_using_config_fetcher(
        client_certificate_request: grpc_ssl_client_certificate_request_type,
        cb: grpc_ssl_server_certificate_config_callback,
        user_data: *mut ::std::os::raw::c_void,
    ) -> *mut grpc_ssl_server_credentials_options;
}
extern "C" {
    #[doc = " Destroys a grpc_ssl_server_credentials_options object."]
    pub fn grpc_ssl_server_credentials_options_destroy(
        options: *mut grpc_ssl_server_credentials_options,
    );
}
extern "C" {
    #[doc = " Creates an SSL server_credentials object using the provided options struct.\n- Takes ownership of the options parameter."]
    pub fn grpc_ssl_server_credentials_create_with_options(
        options: *mut grpc_ssl_server_credentials_options,
    ) -> *mut grpc_server_credentials;
}
extern "C" {
    #[doc = " Sets a credentials to a call. Can only be called on the client side before\ngrpc_call_start_batch."]
    pub fn grpc_call_set_credentials(
        call: *mut grpc_call,
        creds: *mut grpc_call_credentials,
    ) -> grpc_call_error;
}
#[doc = " Callback function that is called when the metadata processing is done.\n- Consumed metadata will be removed from the set of metadata available on the\ncall. consumed_md may be NULL if no metadata has been consumed.\n- Response metadata will be set on the response. response_md may be NULL.\n- status is GRPC_STATUS_OK for success or a specific status for an error.\nCommon error status for auth metadata processing is either\nGRPC_STATUS_UNAUTHENTICATED in case of an authentication failure or\nGRPC_STATUS PERMISSION_DENIED in case of an authorization failure.\n- error_details gives details about the error. May be NULL."]
pub type grpc_process_auth_metadata_done_cb = ::std::option::Option<
    unsafe extern "C" fn(
        user_data: *mut ::std::os::raw::c_void,
        consumed_md: *const grpc_metadata,
        num_consumed_md: usize,
        response_md: *const grpc_metadata,
        num_response_md: usize,
        status: grpc_status_code::Type,
        error_details: *const ::std::os::raw::c_char,
    ),
>;
#[doc = " Pluggable server-side metadata processor object."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_auth_metadata_processor {
    #[doc = " The context object is read/write: it contains the properties of the\nchannel peer and it is the job of the process function to augment it with\nproperties derived from the passed-in metadata.\nThe lifetime of these objects is guaranteed until cb is invoked."]
    pub process: ::std::option::Option<
        unsafe extern "C" fn(
            state: *mut ::std::os::raw::c_void,
            context: *mut grpc_auth_context,
            md: *const grpc_metadata,
            num_md: usize,
            cb: grpc_process_auth_metadata_done_cb,
            user_data: *mut ::std::os::raw::c_void,
        ),
    >,
    pub destroy: ::std::option::Option<unsafe extern "C" fn(state: *mut ::std::os::raw::c_void)>,
    pub state: *mut ::std::os::raw::c_void,
}
extern "C" {
    pub fn grpc_server_credentials_set_auth_metadata_processor(
        creds: *mut grpc_server_credentials,
        processor: grpc_auth_metadata_processor,
    );
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_alts_credentials_options {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " This method creates a grpc ALTS credentials client options instance.\n It is used for experimental purpose for now and subject to change."]
    pub fn grpc_alts_credentials_client_options_create() -> *mut grpc_alts_credentials_options;
}
extern "C" {
    #[doc = " This method creates a grpc ALTS credentials server options instance.\n It is used for experimental purpose for now and subject to change."]
    pub fn grpc_alts_credentials_server_options_create() -> *mut grpc_alts_credentials_options;
}
extern "C" {
    #[doc = " This method adds a target service account to grpc client's ALTS credentials\n options instance. It is used for experimental purpose for now and subject\n to change.\n\n - options: grpc ALTS credentials options instance.\n - service_account: service account of target endpoint."]
    pub fn grpc_alts_credentials_client_options_add_target_service_account(
        options: *mut grpc_alts_credentials_options,
        service_account: *const ::std::os::raw::c_char,
    );
}
extern "C" {
    #[doc = " This method destroys a grpc_alts_credentials_options instance by\n de-allocating all of its occupied memory. It is used for experimental purpose\n for now and subject to change.\n\n - options: a grpc_alts_credentials_options instance that needs to be\n   destroyed."]
    pub fn grpc_alts_credentials_options_destroy(options: *mut grpc_alts_credentials_options);
}
extern "C" {
    #[doc = " This method creates an ALTS channel credential object. The security\n level of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY.\n It is used for experimental purpose for now and subject to change.\n\n - options: grpc ALTS credentials options instance for client.\n\n It returns the created ALTS channel credential object."]
    pub fn grpc_alts_credentials_create(
        options: *const grpc_alts_credentials_options,
    ) -> *mut grpc_channel_credentials;
}
extern "C" {
    #[doc = " This method creates an ALTS server credential object. It is used for\n experimental purpose for now and subject to change.\n\n - options: grpc ALTS credentials options instance for server.\n\n It returns the created ALTS server credential object."]
    pub fn grpc_alts_server_credentials_create(
        options: *const grpc_alts_credentials_options,
    ) -> *mut grpc_server_credentials;
}
extern "C" {
    #[doc = " This method creates a local channel credential object. The security level\n of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY for UDS and\n GRPC_SECURITY_NONE for LOCAL_TCP. It is used for experimental purpose\n for now and subject to change.\n\n - type: local connection type\n\n It returns the created local channel credential object."]
    pub fn grpc_local_credentials_create(
        type_: grpc_local_connect_type,
    ) -> *mut grpc_channel_credentials;
}
extern "C" {
    #[doc = " This method creates a local server credential object. It is used for\n experimental purpose for now and subject to change.\n\n - type: local connection type\n\n It returns the created local server credential object."]
    pub fn grpc_local_server_credentials_create(
        type_: grpc_local_connect_type,
    ) -> *mut grpc_server_credentials;
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_tls_credentials_options {
    _unused: [u8; 0],
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_tls_certificate_provider {
    _unused: [u8; 0],
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_tls_identity_pairs {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Creates a grpc_tls_identity_pairs that stores a list of identity credential\n data, including identity private key and identity certificate chain."]
    pub fn grpc_tls_identity_pairs_create() -> *mut grpc_tls_identity_pairs;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Adds a identity private key and a identity certificate chain to\n grpc_tls_identity_pairs. This function will make an internal copy of\n |private_key| and |cert_chain|."]
    pub fn grpc_tls_identity_pairs_add_pair(
        pairs: *mut grpc_tls_identity_pairs,
        private_key: *const ::std::os::raw::c_char,
        cert_chain: *const ::std::os::raw::c_char,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Destroys a grpc_tls_identity_pairs object. If this object is passed to a\n provider initiation function, the ownership is transferred so this function\n doesn't need to be called. Otherwise the creator of the\n grpc_tls_identity_pairs object is responsible for its destruction."]
    pub fn grpc_tls_identity_pairs_destroy(pairs: *mut grpc_tls_identity_pairs);
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Creates a grpc_tls_certificate_provider that will load credential data from\n static string during initialization. This provider will always return the\n same cert data for all cert names.\n root_certificate and pem_key_cert_pairs can be nullptr, indicating the\n corresponding credential data is not needed.\n This function will make a copy of |root_certificate|.\n The ownership of |pem_key_cert_pairs| is transferred."]
    pub fn grpc_tls_certificate_provider_static_data_create(
        root_certificate: *const ::std::os::raw::c_char,
        pem_key_cert_pairs: *mut grpc_tls_identity_pairs,
    ) -> *mut grpc_tls_certificate_provider;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Creates a grpc_tls_certificate_provider that will watch the credential\n changes on the file system. This provider will always return the up-to-date\n cert data for all the cert names callers set through\n |grpc_tls_credentials_options|. Note that this API only supports one key-cert\n file and hence one set of identity key-cert pair, so SNI(Server Name\n Indication) is not supported.\n - private_key_path is the file path of the private key. This must be set if\n   |identity_certificate_path| is set. Otherwise, it could be null if no\n   identity credentials are needed.\n - identity_certificate_path is the file path of the identity certificate\n   chain. This must be set if |private_key_path| is set. Otherwise, it could\n   be null if no identity credentials are needed.\n - root_cert_path is the file path to the root certificate bundle. This\n   may be null if no root certs are needed.\n - refresh_interval_sec is the refreshing interval that we will check the\n   files for updates.\n It does not take ownership of parameters."]
    pub fn grpc_tls_certificate_provider_file_watcher_create(
        private_key_path: *const ::std::os::raw::c_char,
        identity_certificate_path: *const ::std::os::raw::c_char,
        root_cert_path: *const ::std::os::raw::c_char,
        refresh_interval_sec: ::std::os::raw::c_uint,
    ) -> *mut grpc_tls_certificate_provider;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Releases a grpc_tls_certificate_provider object. The creator of the\n grpc_tls_certificate_provider object is responsible for its release."]
    pub fn grpc_tls_certificate_provider_release(provider: *mut grpc_tls_certificate_provider);
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Creates an grpc_tls_credentials_options."]
    pub fn grpc_tls_credentials_options_create() -> *mut grpc_tls_credentials_options;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Sets the credential provider in the options.\n The |options| will implicitly take a new ref to the |provider|."]
    pub fn grpc_tls_credentials_options_set_certificate_provider(
        options: *mut grpc_tls_credentials_options,
        provider: *mut grpc_tls_certificate_provider,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n If set, gRPC stack will keep watching the root certificates with\n name |root_cert_name|.\n If this is not set on the client side, we will use the root certificates\n stored in the default system location, since client side must provide root\n certificates in TLS.\n If this is not set on the server side, we will not watch any root certificate\n updates, and assume no root certificates needed for the server(single-side\n TLS). Default root certs on the server side is not supported."]
    pub fn grpc_tls_credentials_options_watch_root_certs(
        options: *mut grpc_tls_credentials_options,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Sets the name of the root certificates being watched.\n If not set, We will use a default empty string as the root certificate name."]
    pub fn grpc_tls_credentials_options_set_root_cert_name(
        options: *mut grpc_tls_credentials_options,
        root_cert_name: *const ::std::os::raw::c_char,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n If set, gRPC stack will keep watching the identity key-cert pairs\n with name |identity_cert_name|.\n This is required on the server side, and optional on the client side."]
    pub fn grpc_tls_credentials_options_watch_identity_key_cert_pairs(
        options: *mut grpc_tls_credentials_options,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Sets the name of the identity certificates being watched.\n If not set, We will use a default empty string as the identity certificate\n name."]
    pub fn grpc_tls_credentials_options_set_identity_cert_name(
        options: *mut grpc_tls_credentials_options,
        identity_cert_name: *const ::std::os::raw::c_char,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Sets the options of whether to request and/or verify client certs. This shall\n only be called on the server side."]
    pub fn grpc_tls_credentials_options_set_cert_request_type(
        options: *mut grpc_tls_credentials_options,
        type_: grpc_ssl_client_certificate_request_type,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n If set, gRPC will read all hashed x.509 CRL files in the directory and\n enforce the CRL files on all TLS handshakes. Only supported for OpenSSL\n version > 1.1.\n It is used for experimental purpose for now and subject to change."]
    pub fn grpc_tls_credentials_options_set_crl_directory(
        options: *mut grpc_tls_credentials_options,
        crl_directory: *const ::std::os::raw::c_char,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Sets the options of whether to verify server certs on the client side.\n Passing in a non-zero value indicates verifying the certs."]
    pub fn grpc_tls_credentials_options_set_verify_server_cert(
        options: *mut grpc_tls_credentials_options,
        verify_server_cert: ::std::os::raw::c_int,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Sets whether or not a TLS server should send a list of CA names in the\n ServerHello. This list of CA names is read from the server's trust bundle, so\n that the client can use this list as a hint to know which certificate it\n should send to the server.\n\n WARNING: This API is extremely dangerous and should not be used. If the\n server's trust bundle is too large, then the TLS server will be unable to\n form a ServerHello, and hence will be unusable. The definition of \"too large\"\n depends on the underlying SSL library being used and on the size of the CN\n fields of the certificates in the trust bundle."]
    pub fn grpc_tls_credentials_options_set_send_client_ca_list(
        options: *mut grpc_tls_credentials_options,
        send_client_ca_list: bool,
    );
}
#[doc = " EXPERIMENTAL API - Subject to change\n\n The read-only request information exposed in a verification call.\n Callers should not directly manage the ownership of it. We will make sure it\n is always available inside verify() or cancel() call, and will destroy the\n object at the end of custom verification."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_tls_custom_verification_check_request {
    pub target_name: *const ::std::os::raw::c_char,
    pub peer_info: grpc_tls_custom_verification_check_request_peer_info,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_tls_custom_verification_check_request_peer_info {
    pub common_name: *const ::std::os::raw::c_char,
    pub san_names: grpc_tls_custom_verification_check_request_peer_info_san_names,
    pub peer_cert: *const ::std::os::raw::c_char,
    pub peer_cert_full_chain: *const ::std::os::raw::c_char,
    pub verified_root_cert_subject: *const ::std::os::raw::c_char,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_tls_custom_verification_check_request_peer_info_san_names {
    pub uri_names: *mut *mut ::std::os::raw::c_char,
    pub uri_names_size: usize,
    pub dns_names: *mut *mut ::std::os::raw::c_char,
    pub dns_names_size: usize,
    pub email_names: *mut *mut ::std::os::raw::c_char,
    pub email_names_size: usize,
    pub ip_names: *mut *mut ::std::os::raw::c_char,
    pub ip_names_size: usize,
}
#[doc = " EXPERIMENTAL API - Subject to change\n\n A callback function provided by gRPC as a parameter of the |verify| function\n in grpc_tls_certificate_verifier_external. If |verify| is expected to be run\n asynchronously, the implementer of |verify| will need to invoke this callback\n with |callback_arg| and proper verification status at the end to bring the\n control back to gRPC C core."]
pub type grpc_tls_on_custom_verification_check_done_cb = ::std::option::Option<
    unsafe extern "C" fn(
        request: *mut grpc_tls_custom_verification_check_request,
        callback_arg: *mut ::std::os::raw::c_void,
        status: grpc_status_code::Type,
        error_details: *const ::std::os::raw::c_char,
    ),
>;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_tls_certificate_verifier {
    _unused: [u8; 0],
}
#[doc = " EXPERIMENTAL API - Subject to change\n\n A struct containing all the necessary functions a custom external verifier\n needs to implement to be able to be converted to an internal verifier."]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_tls_certificate_verifier_external {
    pub user_data: *mut ::std::os::raw::c_void,
    #[doc = " A function pointer containing the verification logic that will be\n performed after the TLS handshake is done. It could be processed\n synchronously or asynchronously.\n - If expected to be processed synchronously, the implementer should\n   populate the verification result through |sync_status| and\n   |sync_error_details|, and then return true.\n - If expected to be processed asynchronously, the implementer should return\n   false immediately, and then in the asynchronous thread invoke |callback|\n   with the verification result. The implementer MUST NOT invoke the async\n   |callback| in the same thread before |verify| returns, otherwise it can\n   lead to deadlocks.\n\n user_data: any argument that is passed in the user_data of\n            grpc_tls_certificate_verifier_external during construction time\n            can be retrieved later here.\n request: request information exposed to the function implementer.\n callback: the callback that the function implementer needs to invoke, if\n           return a non-zero value. It is usually invoked when the\n           asynchronous verification is done, and serves to bring the\n           control back to gRPC.\n callback_arg: A pointer to the internal ExternalVerifier instance. This is\n               mainly used as an argument in |callback|, if want to invoke\n               |callback| in async mode.\n sync_status: indicates if a connection should be allowed. This should only\n              be used if the verification check is done synchronously.\n sync_error_details: the error generated while verifying a connection. This\n                     should only be used if the verification check is done\n                     synchronously. the implementation must allocate the\n                     error string via gpr_malloc() or gpr_strdup().\n return: return 0 if |verify| is expected to be executed asynchronously,\n         otherwise return a non-zero value."]
    pub verify: ::std::option::Option<
        unsafe extern "C" fn(
            user_data: *mut ::std::os::raw::c_void,
            request: *mut grpc_tls_custom_verification_check_request,
            callback: grpc_tls_on_custom_verification_check_done_cb,
            callback_arg: *mut ::std::os::raw::c_void,
            sync_status: *mut grpc_status_code::Type,
            sync_error_details: *mut *mut ::std::os::raw::c_char,
        ) -> ::std::os::raw::c_int,
    >,
    #[doc = " A function pointer that cleans up the caller-specified resources when the\n verifier is still running but the whole connection got cancelled. This\n could happen when the verifier is doing some async operations, and the\n whole handshaker object got destroyed because of connection time limit is\n reached, or any other reasons. In such cases, function implementers might\n want to be notified, and properly clean up some resources.\n\n user_data: any argument that is passed in the user_data of\n            grpc_tls_certificate_verifier_external during construction time\n            can be retrieved later here.\n request: request information exposed to the function implementer. It will\n          be the same request object that was passed to verify(), and it\n          tells the cancel() which request to cancel."]
    pub cancel: ::std::option::Option<
        unsafe extern "C" fn(
            user_data: *mut ::std::os::raw::c_void,
            request: *mut grpc_tls_custom_verification_check_request,
        ),
    >,
    #[doc = " A function pointer that does some additional destruction work when the\n verifier is destroyed. This is used when the caller wants to associate some\n objects to the lifetime of external_verifier, and destroy them when\n external_verifier got destructed. For example, in C++, the class containing\n user-specified callback functions should not be destroyed before\n external_verifier, since external_verifier will invoke them while being\n used.\n Note that the caller MUST delete the grpc_tls_certificate_verifier_external\n object itself in this function, otherwise it will cause memory leaks. That\n also means the user_data has to carries at least a self pointer, for the\n callers to later delete it in destruct().\n\n user_data: any argument that is passed in the user_data of\n            grpc_tls_certificate_verifier_external during construction time\n            can be retrieved later here."]
    pub destruct:
        ::std::option::Option<unsafe extern "C" fn(user_data: *mut ::std::os::raw::c_void)>,
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Converts an external verifier to an internal verifier.\n Note that we will not take the ownership of the external_verifier. Callers\n will need to delete external_verifier in its own destruct function."]
    pub fn grpc_tls_certificate_verifier_external_create(
        external_verifier: *mut grpc_tls_certificate_verifier_external,
    ) -> *mut grpc_tls_certificate_verifier;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Factory function for an internal verifier that won't perform any\n post-handshake verification. Note: using this solely without any other\n authentication mechanisms on the peer identity will leave your applications\n to the MITM(Man-In-The-Middle) attacks. Users should avoid doing so in\n production environments."]
    pub fn grpc_tls_certificate_verifier_no_op_create() -> *mut grpc_tls_certificate_verifier;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Factory function for an internal verifier that will do the default hostname\n check."]
    pub fn grpc_tls_certificate_verifier_host_name_create() -> *mut grpc_tls_certificate_verifier;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Releases a grpc_tls_certificate_verifier object. The creator of the\n grpc_tls_certificate_verifier object is responsible for its release."]
    pub fn grpc_tls_certificate_verifier_release(verifier: *mut grpc_tls_certificate_verifier);
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Sets the verifier in options. The |options| will implicitly take a new ref to\n the |verifier|. If not set on the client side, we will verify server's\n certificates, and check the default hostname. If not set on the server side,\n we will verify client's certificates."]
    pub fn grpc_tls_credentials_options_set_certificate_verifier(
        options: *mut grpc_tls_credentials_options,
        verifier: *mut grpc_tls_certificate_verifier,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Sets the options of whether to check the hostname of the peer on a per-call\n basis. This is usually used in a combination with virtual hosting at the\n client side, where each individual call on a channel can have a different\n host associated with it.\n This check is intended to verify that the host specified for the individual\n call is covered by the cert that the peer presented.\n The default is a non-zero value, which indicates performing such checks."]
    pub fn grpc_tls_credentials_options_set_check_call_host(
        options: *mut grpc_tls_credentials_options,
        check_call_host: ::std::os::raw::c_int,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Performs the verification logic of an internal verifier.\n This is typically used when composing the internal verifiers as part of the\n custom verification.\n If |grpc_tls_certificate_verifier_verify| returns true, inspect the\n verification result through request->status and request->error_details.\n Otherwise, inspect through the parameter of |callback|."]
    pub fn grpc_tls_certificate_verifier_verify(
        verifier: *mut grpc_tls_certificate_verifier,
        request: *mut grpc_tls_custom_verification_check_request,
        callback: grpc_tls_on_custom_verification_check_done_cb,
        callback_arg: *mut ::std::os::raw::c_void,
        sync_status: *mut grpc_status_code::Type,
        sync_error_details: *mut *mut ::std::os::raw::c_char,
    ) -> ::std::os::raw::c_int;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Performs the cancellation logic of an internal verifier.\n This is typically used when composing the internal verifiers as part of the\n custom verification."]
    pub fn grpc_tls_certificate_verifier_cancel(
        verifier: *mut grpc_tls_certificate_verifier,
        request: *mut grpc_tls_custom_verification_check_request,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Creates a TLS channel credential object based on the\n grpc_tls_credentials_options specified by callers. The\n grpc_channel_credentials will take the ownership of the |options|. The\n security level of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY."]
    pub fn grpc_tls_credentials_create(
        options: *mut grpc_tls_credentials_options,
    ) -> *mut grpc_channel_credentials;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n Creates a TLS server credential object based on the\n grpc_tls_credentials_options specified by callers. The\n grpc_server_credentials will take the ownership of the |options|."]
    pub fn grpc_tls_server_credentials_create(
        options: *mut grpc_tls_credentials_options,
    ) -> *mut grpc_server_credentials;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n This method creates an insecure channel credentials object."]
    pub fn grpc_insecure_credentials_create() -> *mut grpc_channel_credentials;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n This method creates an insecure server credentials object."]
    pub fn grpc_insecure_server_credentials_create() -> *mut grpc_server_credentials;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n This method creates an xDS channel credentials object.\n\n Creating a channel with credentials of this type indicates that the channel\n should get credentials configuration from the xDS control plane.\n\n \\a fallback_credentials are used if the channel target does not have the\n 'xds:///' scheme or if the xDS control plane does not provide information on\n how to fetch credentials dynamically. Does NOT take ownership of the \\a\n fallback_credentials. (Internally takes a ref to the object.)"]
    pub fn grpc_xds_credentials_create(
        fallback_credentials: *mut grpc_channel_credentials,
    ) -> *mut grpc_channel_credentials;
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change\n\n This method creates an xDS server credentials object.\n\n \\a fallback_credentials are used if the xDS control plane does not provide\n information on how to fetch credentials dynamically.\n\n Does NOT take ownership of the \\a fallback_credentials. (Internally takes\n a ref to the object.)"]
    pub fn grpc_xds_server_credentials_create(
        fallback_credentials: *mut grpc_server_credentials,
    ) -> *mut grpc_server_credentials;
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpc_authorization_policy_provider {
    _unused: [u8; 0],
}
extern "C" {
    #[doc = " EXPERIMENTAL - Subject to change.\n Creates a grpc_authorization_policy_provider using gRPC authorization policy\n from static string.\n - authz_policy is the input gRPC authorization policy.\n - code is the error status code on failure. On success, it equals\n   GRPC_STATUS_OK.\n - error_details contains details about the error if any. If the\n   initialization is successful, it will be null. Caller must use gpr_free to\n   destroy this string."]
    pub fn grpc_authorization_policy_provider_static_data_create(
        authz_policy: *const ::std::os::raw::c_char,
        code: *mut grpc_status_code::Type,
        error_details: *mut *const ::std::os::raw::c_char,
    ) -> *mut grpc_authorization_policy_provider;
}
extern "C" {
    #[doc = " EXPERIMENTAL - Subject to change.\n Creates a grpc_authorization_policy_provider by watching for gRPC\n authorization policy changes in filesystem.\n - authz_policy is the file path of gRPC authorization policy.\n - refresh_interval_sec is the amount of time the internal thread would wait\n   before checking for file updates.\n - code is the error status code on failure. On success, it equals\n   GRPC_STATUS_OK.\n - error_details contains details about the error if any. If the\n   initialization is successful, it will be null. Caller must use gpr_free to\n   destroy this string."]
    pub fn grpc_authorization_policy_provider_file_watcher_create(
        authz_policy_path: *const ::std::os::raw::c_char,
        refresh_interval_sec: ::std::os::raw::c_uint,
        code: *mut grpc_status_code::Type,
        error_details: *mut *const ::std::os::raw::c_char,
    ) -> *mut grpc_authorization_policy_provider;
}
extern "C" {
    #[doc = " EXPERIMENTAL - Subject to change.\n Releases grpc_authorization_policy_provider object. The creator of\n grpc_authorization_policy_provider is responsible for its release."]
    pub fn grpc_authorization_policy_provider_release(
        provider: *mut grpc_authorization_policy_provider,
    );
}
extern "C" {
    #[doc = " EXPERIMENTAL API - Subject to change.\n Configures a grpc_tls_credentials_options object with tls session key\n logging capability. TLS channels using these credentials have tls session\n key logging enabled.\n - options is the grpc_tls_credentials_options object\n - path is a string pointing to the location where TLS session keys would be\n   stored."]
    pub fn grpc_tls_credentials_options_set_tls_session_key_log_file_path(
        options: *mut grpc_tls_credentials_options,
        path: *const ::std::os::raw::c_char,
    );
}
extern "C" {
    #[doc = " malloc.\n If size==0, always returns NULL. Otherwise this function never returns NULL.\n The pointer returned is suitably aligned for any kind of variable it could\n contain."]
    pub fn gpr_malloc(size: usize) -> *mut ::std::os::raw::c_void;
}
extern "C" {
    #[doc = " like malloc, but zero all bytes before returning them"]
    pub fn gpr_zalloc(size: usize) -> *mut ::std::os::raw::c_void;
}
extern "C" {
    #[doc = " free"]
    pub fn gpr_free(ptr: *mut ::std::os::raw::c_void);
}
extern "C" {
    #[doc = " realloc, never returns NULL"]
    pub fn gpr_realloc(p: *mut ::std::os::raw::c_void, size: usize) -> *mut ::std::os::raw::c_void;
}
extern "C" {
    #[doc = " aligned malloc, never returns NULL, will align to alignment, which\n must be a power of 2."]
    pub fn gpr_malloc_aligned(size: usize, alignment: usize) -> *mut ::std::os::raw::c_void;
}
extern "C" {
    #[doc = " free memory allocated by gpr_malloc_aligned"]
    pub fn gpr_free_aligned(ptr: *mut ::std::os::raw::c_void);
}
extern "C" {
    #[doc = " Return the number of CPU cores on the current system. Will return 0 if\nthe information is not available."]
    pub fn gpr_cpu_num_cores() -> ::std::os::raw::c_uint;
}
extern "C" {
    #[doc = " Return the CPU on which the current thread is executing; N.B. This should\nbe considered advisory only - it is possible that the thread is switched\nto a different CPU at any time. Returns a value in range\n[0, gpr_cpu_num_cores() - 1]"]
    pub fn gpr_cpu_current_cpu() -> ::std::os::raw::c_uint;
}
#[repr(u32)]
#[doc = " The severity of a log message - use the #defines below when calling into\ngpr_log to additionally supply file and line data"]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum gpr_log_severity {
    GPR_LOG_SEVERITY_DEBUG = 0,
    GPR_LOG_SEVERITY_INFO = 1,
    GPR_LOG_SEVERITY_ERROR = 2,
}
extern "C" {
    #[doc = " Returns a string representation of the log severity"]
    pub fn gpr_log_severity_string(severity: gpr_log_severity) -> *const ::std::os::raw::c_char;
}
extern "C" {
    #[doc = " Log a message. It's advised to use GPR_xxx above to generate the context\n for each message"]
    pub fn gpr_log(
        file: *const ::std::os::raw::c_char,
        line: ::std::os::raw::c_int,
        severity: gpr_log_severity,
        format: *const ::std::os::raw::c_char,
        ...
    );
}
extern "C" {
    pub fn gpr_should_log(severity: gpr_log_severity) -> ::std::os::raw::c_int;
}
extern "C" {
    pub fn gpr_log_message(
        file: *const ::std::os::raw::c_char,
        line: ::std::os::raw::c_int,
        severity: gpr_log_severity,
        message: *const ::std::os::raw::c_char,
    );
}
extern "C" {
    #[doc = " Set global log verbosity"]
    pub fn gpr_set_log_verbosity(min_severity_to_print: gpr_log_severity);
}
extern "C" {
    pub fn gpr_log_verbosity_init();
}
#[doc = " Log overrides: applications can use this API to intercept logging calls\nand use their own implementations"]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct gpr_log_func_args {
    pub file: *const ::std::os::raw::c_char,
    pub line: ::std::os::raw::c_int,
    pub severity: gpr_log_severity,
    pub message: *const ::std::os::raw::c_char,
}
pub type gpr_log_func = ::std::option::Option<unsafe extern "C" fn(args: *mut gpr_log_func_args)>;
extern "C" {
    pub fn gpr_set_log_function(func: gpr_log_func);
}
extern "C" {
    pub fn gpr_assertion_failed(
        filename: *const ::std::os::raw::c_char,
        line: ::std::os::raw::c_int,
        message: *const ::std::os::raw::c_char,
    ) -> !;
}
extern "C" {
    #[doc = " Returns a string allocated with gpr_malloc that contains a UTF-8\n formatted error message, corresponding to the error messageid.\n Use in conjunction with GetLastError() et al."]
    pub fn gpr_format_message(messageid: ::std::os::raw::c_int) -> *mut ::std::os::raw::c_char;
}
extern "C" {
    #[doc = " Returns a copy of src that can be passed to gpr_free().\nIf allocation fails or if src is NULL, returns NULL."]
    pub fn gpr_strdup(src: *const ::std::os::raw::c_char) -> *mut ::std::os::raw::c_char;
}
extern "C" {
    #[doc = " printf to a newly-allocated string.  The set of supported formats may vary\nbetween platforms.\n\nOn success, returns the number of bytes printed (excluding the final '\\0'),\nand *strp points to a string which must later be destroyed with gpr_free().\n\nOn error, returns -1 and sets *strp to NULL. If the format string is bad,\nthe result is undefined."]
    pub fn gpr_asprintf(
        strp: *mut *mut ::std::os::raw::c_char,
        format: *const ::std::os::raw::c_char,
        ...
    ) -> ::std::os::raw::c_int;
}
pub type gpr_thd_id = usize;
extern "C" {
    #[doc = " Returns the identifier of the current thread."]
    pub fn gpr_thd_currentid() -> gpr_thd_id;
}
#[doc = " Reader for byte buffers. Iterates over slices in the byte buffer"]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpc_byte_buffer_reader {
    pub buffer_in: *mut grpc_byte_buffer,
    pub buffer_out: *mut grpc_byte_buffer,
    pub current: grpc_byte_buffer_reader_grpc_byte_buffer_reader_current,
}
#[doc = " Different current objects correspond to different types of byte buffers"]
#[repr(C)]
#[derive(Copy, Clone)]
pub union grpc_byte_buffer_reader_grpc_byte_buffer_reader_current {
    #[doc = " Index into a slice buffer's array of slices"]
    pub index: ::std::os::raw::c_uint,
}
impl ::std::fmt::Debug for grpc_byte_buffer_reader_grpc_byte_buffer_reader_current {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(
            f,
            "grpc_byte_buffer_reader_grpc_byte_buffer_reader_current {{ union }}"
        )
    }
}
impl ::std::fmt::Debug for grpc_byte_buffer_reader {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write!(
            f,
            "grpc_byte_buffer_reader {{ buffer_in: {:?}, buffer_out: {:?}, current: {:?} }}",
            self.buffer_in, self.buffer_out, self.current
        )
    }
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpcwrap_batch_context {
    pub send_initial_metadata: grpc_metadata_array,
    pub send_message: *mut grpc_byte_buffer,
    pub send_status_from_server: grpcwrap_batch_context__bindgen_ty_1,
    pub recv_initial_metadata: grpc_metadata_array,
    pub recv_message: *mut grpc_byte_buffer,
    pub recv_status_on_client: grpcwrap_batch_context__bindgen_ty_2,
    pub recv_close_on_server_cancelled: ::std::os::raw::c_int,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct grpcwrap_batch_context__bindgen_ty_1 {
    pub trailing_metadata: grpc_metadata_array,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpcwrap_batch_context__bindgen_ty_2 {
    pub trailing_metadata: grpc_metadata_array,
    pub status: grpc_status_code::Type,
    pub status_details: grpc_slice,
    pub error_string: *const ::std::os::raw::c_char,
}
impl ::std::fmt::Debug for grpcwrap_batch_context__bindgen_ty_2 {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write ! (f , "grpcwrap_batch_context__bindgen_ty_2 {{ trailing_metadata: {:?}, status: {:?}, status_details: {:?}, error_string: {:?} }}" , self . trailing_metadata , self . status , self . status_details , self . error_string)
    }
}
impl ::std::fmt::Debug for grpcwrap_batch_context {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write ! (f , "grpcwrap_batch_context {{ send_initial_metadata: {:?}, send_message: {:?}, send_status_from_server: {:?}, recv_initial_metadata: {:?}, recv_message: {:?}, recv_status_on_client: {:?}, recv_close_on_server_cancelled: {:?} }}" , self . send_initial_metadata , self . send_message , self . send_status_from_server , self . recv_initial_metadata , self . recv_message , self . recv_status_on_client , self . recv_close_on_server_cancelled)
    }
}
extern "C" {
    pub fn grpcwrap_batch_context_create() -> *mut grpcwrap_batch_context;
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct grpcwrap_request_call_context {
    pub call: *mut grpc_call,
    pub call_details: grpc_call_details,
    pub request_metadata: grpc_metadata_array,
}
impl ::std::fmt::Debug for grpcwrap_request_call_context {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        write ! (f , "grpcwrap_request_call_context {{ call: {:?}, call_details: {:?}, request_metadata: {:?} }}" , self . call , self . call_details , self . request_metadata)
    }
}
extern "C" {
    pub fn grpcwrap_request_call_context_create() -> *mut grpcwrap_request_call_context;
}
extern "C" {
    pub fn grpcwrap_metadata_array_destroy_metadata_only(array: *mut grpc_metadata_array);
}
extern "C" {
    pub fn grpcwrap_metadata_array_destroy_metadata_including_entries(
        array: *mut grpc_metadata_array,
    );
}
extern "C" {
    pub fn grpcwrap_metadata_array_destroy_full(array: *mut grpc_metadata_array);
}
extern "C" {
    pub fn grpcwrap_metadata_array_init(array: *mut grpc_metadata_array, capacity: usize);
}
extern "C" {
    pub fn grpcwrap_metadata_array_add(
        array: *mut grpc_metadata_array,
        key: *const ::std::os::raw::c_char,
        key_length: usize,
        value: *const ::std::os::raw::c_char,
        value_length: usize,
    );
}
extern "C" {
    pub fn grpcwrap_metadata_array_get_key(
        array: *const grpc_metadata_array,
        index: usize,
        key_length: *mut usize,
    ) -> *const ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpcwrap_metadata_array_get_value(
        array: *const grpc_metadata_array,
        index: usize,
        value_length: *mut usize,
    ) -> *const ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpcwrap_metadata_array_cleanup(array: *mut grpc_metadata_array);
}
extern "C" {
    pub fn grpcwrap_metadata_array_shrink_to_fit(array: *mut grpc_metadata_array);
}
extern "C" {
    pub fn grpcwrap_metadata_array_move(
        dest: *mut grpc_metadata_array,
        src: *mut grpc_metadata_array,
    );
}
extern "C" {
    pub fn grpcwrap_batch_context_destroy(ctx: *mut grpcwrap_batch_context);
}
extern "C" {
    pub fn grpcwrap_request_call_context_destroy(ctx: *mut grpcwrap_request_call_context);
}
extern "C" {
    pub fn grpcwrap_batch_context_take_recv_initial_metadata(
        ctx: *mut grpcwrap_batch_context,
        res: *mut grpc_metadata_array,
    );
}
extern "C" {
    pub fn grpcwrap_batch_context_take_recv_status_on_client_trailing_metadata(
        ctx: *mut grpcwrap_batch_context,
        res: *mut grpc_metadata_array,
    );
}
extern "C" {
    pub fn grpcwrap_slice_raw_offset(
        slice: *const grpc_slice,
        offset: usize,
        len: *mut usize,
    ) -> *const ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpcwrap_slice_copy(slice: *const grpc_slice) -> grpc_slice;
}
extern "C" {
    pub fn grpcwrap_slice_unref(slice: *const grpc_slice);
}
extern "C" {
    pub fn grpcwrap_slice_ref(slice: *const grpc_slice) -> grpc_slice;
}
extern "C" {
    pub fn grpcwrap_slice_length(slice: *const grpc_slice) -> usize;
}
extern "C" {
    pub fn grpcwrap_batch_context_take_recv_message(
        ctx: *mut grpcwrap_batch_context,
    ) -> *mut grpc_byte_buffer;
}
extern "C" {
    pub fn grpcwrap_batch_context_recv_status_on_client_status(
        ctx: *const grpcwrap_batch_context,
    ) -> grpc_status_code::Type;
}
extern "C" {
    pub fn grpcwrap_batch_context_recv_status_on_client_details(
        ctx: *const grpcwrap_batch_context,
        details_length: *mut usize,
    ) -> *const ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpcwrap_batch_context_recv_status_on_client_trailing_metadata(
        ctx: *const grpcwrap_batch_context,
    ) -> *const grpc_metadata_array;
}
extern "C" {
    pub fn grpcwrap_batch_context_recv_status_on_client_error_string(
        ctx: *const grpcwrap_batch_context,
    ) -> *const ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpcwrap_request_call_context_ref_call(
        ctx: *mut grpcwrap_request_call_context,
    ) -> *mut grpc_call;
}
extern "C" {
    pub fn grpcwrap_request_call_context_get_call(
        ctx: *mut grpcwrap_request_call_context,
    ) -> *mut grpc_call;
}
extern "C" {
    pub fn grpcwrap_request_call_context_method(
        ctx: *const grpcwrap_request_call_context,
        method_length: *mut usize,
    ) -> *const ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpcwrap_request_call_context_host(
        ctx: *const grpcwrap_request_call_context,
        host_length: *mut usize,
    ) -> *const ::std::os::raw::c_char;
}
extern "C" {
    pub fn grpcwrap_request_call_context_deadline(
        ctx: *const grpcwrap_request_call_context,
    ) -> gpr_timespec;
}
extern "C" {
    pub fn grpcwrap_request_call_context_metadata_array(
        ctx: *const grpcwrap_request_call_context,
    ) -> *const grpc_metadata_array;
}
extern "C" {
    pub fn grpcwrap_batch_context_recv_close_on_server_cancelled(
        ctx: *const grpcwrap_batch_context,
    ) -> i32;
}
extern "C" {
    pub fn grpcwrap_channel_create_call(
        channel: *mut grpc_channel,
        parent_call: *mut grpc_call,
        propagation_mask: u32,
        cq: *mut grpc_completion_queue,
        method: *const ::std::os::raw::c_char,
        method_len: usize,
        host: *const ::std::os::raw::c_char,
        host_len: usize,
        deadline: gpr_timespec,
    ) -> *mut grpc_call;
}
extern "C" {
    pub fn grpcwrap_channel_args_create(num_args: usize) -> *mut grpc_channel_args;
}
extern "C" {
    pub fn grpcwrap_channel_args_set_string(
        args: *mut grpc_channel_args,
        index: usize,
        key: *const ::std::os::raw::c_char,
        value: *const ::std::os::raw::c_char,
    );
}
extern "C" {
    pub fn grpcwrap_channel_args_set_integer(
        args: *mut grpc_channel_args,
        index: usize,
        key: *const ::std::os::raw::c_char,
        value: ::std::os::raw::c_int,
    );
}
extern "C" {
    pub fn grpcwrap_channel_args_set_pointer_vtable(
        args: *mut grpc_channel_args,
        index: usize,
        key: *const ::std::os::raw::c_char,
        value: *mut ::std::os::raw::c_void,
        vtable: *const grpc_arg_pointer_vtable,
    );
}
extern "C" {
    pub fn grpcwrap_channel_args_destroy(args: *mut grpc_channel_args);
}
extern "C" {
    pub fn grpcwrap_call_start_unary(
        call: *mut grpc_call,
        ctx: *mut grpcwrap_batch_context,
        send_buffer: *mut grpc_slice,
        write_flags: u32,
        initial_metadata: *mut grpc_metadata_array,
        initial_metadata_flags: u32,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_call_start_client_streaming(
        call: *mut grpc_call,
        ctx: *mut grpcwrap_batch_context,
        initial_metadata: *mut grpc_metadata_array,
        initial_metadata_flags: u32,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_call_start_server_streaming(
        call: *mut grpc_call,
        ctx: *mut grpcwrap_batch_context,
        send_buffer: *mut grpc_slice,
        write_flags: u32,
        initial_metadata: *mut grpc_metadata_array,
        initial_metadata_flags: u32,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_call_start_duplex_streaming(
        call: *mut grpc_call,
        ctx: *mut grpcwrap_batch_context,
        initial_metadata: *mut grpc_metadata_array,
        initial_metadata_flags: u32,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_call_recv_initial_metadata(
        call: *mut grpc_call,
        ctx: *mut grpcwrap_batch_context,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_call_send_message(
        call: *mut grpc_call,
        ctx: *mut grpcwrap_batch_context,
        send_buffer: *mut grpc_slice,
        write_flags: u32,
        initial_metadata: *mut grpc_metadata_array,
        initial_metadata_flags: u32,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_call_send_close_from_client(
        call: *mut grpc_call,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_call_send_status_from_server(
        call: *mut grpc_call,
        ctx: *mut grpcwrap_batch_context,
        status_code: grpc_status_code::Type,
        status_details: *const ::std::os::raw::c_char,
        status_details_len: usize,
        initial_metadata: *mut grpc_metadata_array,
        initial_metadata_flags: u32,
        trailing_metadata: *mut grpc_metadata_array,
        optional_send_buffer: *mut grpc_slice,
        write_flags: u32,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_call_recv_message(
        call: *mut grpc_call,
        ctx: *mut grpcwrap_batch_context,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_call_start_serverside(
        call: *mut grpc_call,
        ctx: *mut grpcwrap_batch_context,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_call_send_initial_metadata(
        call: *mut grpc_call,
        ctx: *mut grpcwrap_batch_context,
        initial_metadata: *mut grpc_metadata_array,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    #[doc = " Kick call's completion queue, it should be called after there is an event\nready to poll.\nTHREAD SAFETY: grpcwrap_call_kick_completion_queue is thread-safe\nbecause it does not change the call's state."]
    pub fn grpcwrap_call_kick_completion_queue(
        call: *mut grpc_call,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
extern "C" {
    pub fn grpcwrap_server_request_call(
        server: *mut grpc_server,
        cq: *mut grpc_completion_queue,
        ctx: *mut grpcwrap_request_call_context,
        tag: *mut ::std::os::raw::c_void,
    ) -> grpc_call_error;
}
